This was extracted from Moon's data_model package.
# You can use the Fields, in your own objects
class MyAwesomeModel
  include Moon::DataModel::Fields
  field :id,   type: String, default: proc { "GIMME_AN_ID" }
  field :name, type: String
  def initialize(options = {})
    # you can then initialize the fields using
    initialize_fields(options )
  end
end
model = MyAwesomeModel.new name: 'Albert' 
model.id   #=> GIMME_AN_ID
model.name #=> Albert
model = MyAwesomeModel.new id: 'ABCD1234', name: 'Simon'
model.id   #=> ABCD1234
model.name #=> Simon
# Or you can just grab one of the existing base classes
class MyAwesomeModel < Moon::DataModel::Metal
  field :id,   type: String, default: proc { "GIMME_AN_ID" }
  field :name, type: String
end
# Did we mention that you also get all fields from your parent class :3
class MyAwesomeModelOfDoom < Moon::DataModel::Base
end
m = MyAwesomeModelOfDoom.new
m.id  # => ABCDEF1234567890
m.name # => ''
m.meta # => {}
m.note # => ''
m.tags # => []If you are using DataModel as a rubygem, then you must use active_support, to get inflections, otherwise, use moon-inflector.
Unless you require DataModel via data_model/load,
Be sure to set a TypeValidator before using it:
# soft validator
Moon::DataModel::Validators::Type.default = Moon::DataModel::TypeValidators::Soft
# verbose validator
Moon::DataModel::Validators::Type.default = Moon::DataModel::TypeValidators::Verbose
# null validator
Moon::DataModel::Validators::Type.default = Moon::DataModel::TypeValidators::Null