- further decoupling
- added some defensive checks
- test extensibility