Design Patterns inspired by http://pavelfatin.com/design-patterns-in-scala/