- refactoring step 5 - 
- test error free, but need much work
- introduce guava Preconditions