robust
add arbitrary metadata
add arbitrary metadata
set defaults more easily; better validations
fix for function type
make options be defined on obj