Patterns of Software Construction