Design Tips
- reduce the number of classes and methods users have to override
- simplify the interaction between the framework and the application extensions
- isolate platform dependent code
- do as much as possible within the framework
- factor code so that users can override limiting assumptions
- provide notification hooks so that users can react to important state changes
- consolidate similar functionality into a single abstraction
- break down larger abstractions into smaller ones with greater flexibility
- implement each key variation of an abstraction as a class
- use composition rather than inheritance