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 |