Move `model` and `augment` to separate files
Allow setting methods and properties separately for simpler api
Extract validation to separate class
Add support for object and array data types