Module: Pour::Propertied::ClassMethods

Defined in:
lib/pour/propertied.rb

Instance Method Summary collapse

Instance Method Details

#__properties__Object



31
32
33
34
35
36
37
38
# File 'lib/pour/propertied.rb', line 31

def __properties__
  if self.class.superclass.included_modules.include? Pour::Pourable
    properties = self.class.superclass.class_variable_get(:@@__properties__)
    self.class_variable_set(:@@__properties__, properties)
  end

  self.class_variable_get(:@@__properties__)
end

#__properties__=(properties) ⇒ Object



40
41
42
# File 'lib/pour/propertied.rb', line 40

def __properties__=(properties)
  self.class_variable_set(:@@__properties__, properties)
end

#property(name, typespec) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/pour/propertied.rb', line 4

def property(name, typespec)
  if self.__properties__.map(&:name).include?(name)
    raise "Already have a property called '#{name}'!"
  end

  property = Pour::Property.new(name: name, typespec: typespec)
  self.__properties__ = self.__properties__ + [property]

  decorated = "@#{name}".to_sym
  reader = name.to_sym
  writer = "#{name}=".to_sym

  self.send :define_method, reader do
    self.instance_variable_get(decorated)
  end

  self.send :define_method, writer do |new_value|
    if property.typespec.valid?(new_value)
      self.instance_variable_set(decorated, new_value)
    else
      # TODO(mtwilliams): Recursively map to determine where and why the

      # |new_value| doesn't match the typespec.

      raise "#{new_value.inspect} doesn't match typespec: #{typespec.inspect}"
    end
  end
end