module Koine
provides the following API
@example using attributes
class Person include Koine::Attributes attributes do attribute :name, :string attribute :birthday, :date # or attribute :birthday, Koine::Attributes::Adapter::Date.new end end peson = Person.new person.name = 'John Doe' person.birtday = '2001-02-31' # Date Object can also be given person.name # => 'John Doe' person.birtday # => #<Date 2001-02-31>
@example custom attribute options
attributes do attribute :name, Koine::Attributes::Adapters::Date.new.with_default('guest') # or attribute :name, :string, ->(adapter) { adapter.with_default('guest') } end
@example Constructor for attributes
class Person include Koine::Attributes attributes initializer: true do attribute :name, :string attribute :birthday, :date end end person = Person.new(name: 'John Doe', birthday: '2001-01-31') # foo: attribute will raise error with strict mode person = Person.new(name: 'John Doe', birthday: '2001-01-31', foo: :bar)
@example Constructor for attributes withouth strict mode
class Person include Koine::Attributes attributes initializer: { strict: false } do attribute :name, :string attribute :birthday, :date end end # foo will be ignored person = Person.new(name: 'John Doe', birthday: '2001-01-31', foo: :bar)
@example Override constructor
class Person include Koine::Attributes attr_reader :foo attributes initializer: true do attribute :name, :string attribute :birthday, :date end def initialize(attributes = {}) @foo = attributes.delete(:foo) self.attributes.set_values(attributes) end end person = Person.new(name: 'John Doe', birthday: '2001-01-31', foo: :bar) person.foo # => :bar
@example
class Location include Koine::Attributes attributes initializer: { freeze: true } do attribute :lat, :float attribute :lon, :float end end location = Location.new(lat: 1, lon: 2) new_location = location.with_lon(3)