https://jingling.im/posts/composite-design-pattern/