Module: Trax::Model::Attributes::Mixin::ClassMethods
- Defined in:
- lib/trax/model/attributes/mixin.rb
Instance Method Summary collapse
- #define_attributes(&block) ⇒ Object
- #evaluate_attribute_definitions_blocks ⇒ Object
-
#fetch_attribute_definitions_in_chain(_attribute_definitions_blocks = [], klass = nil) ⇒ Object
recursively search direct parent classes for attribute definitions, so we can fully support inheritance.
- #fields ⇒ Object
- #fields_module ⇒ Object
- #trax_attribute(name, type:, **options, &block) ⇒ Object
Instance Method Details
#define_attributes(&block) ⇒ Object
18 19 20 |
# File 'lib/trax/model/attributes/mixin.rb', line 18 def define_attributes(&block) self.instance_variable_set("@_attribute_definitions_block", block) end |
#evaluate_attribute_definitions_blocks ⇒ Object
60 61 62 63 64 65 66 67 |
# File 'lib/trax/model/attributes/mixin.rb', line 60 def evaluate_attribute_definitions_blocks model_klass_proxy = ::Trax::Model::Attributes::Definitions.new(self) attribute_definition_blocks = self.superclasses_until(::ActiveRecord::Base, self, [ self ]).map{ |klass| klass.instance_variable_get(:@_attribute_definitions_block) }.compact attribute_definition_blocks.each do |blk| model_klass_proxy.instance_eval(&blk) end if attribute_definition_blocks.any? end |
#fetch_attribute_definitions_in_chain(_attribute_definitions_blocks = [], klass = nil) ⇒ Object
recursively search direct parent classes for attribute definitions, so we can fully support inheritance
24 25 26 27 28 29 30 31 32 |
# File 'lib/trax/model/attributes/mixin.rb', line 24 def fetch_attribute_definitions_in_chain(_attribute_definitions_blocks = [], klass=nil) _attribute_definitions_blocks.push(klass.instance_variable_get("@_attribute_definitions_block")) if klass && klass.instance_variable_defined?("@_attribute_definitions_block") if klass && klass.superclass != ::ActiveRecord::Base return fetch_attribute_definitions_in_chain(_attribute_definitions_blocks, klass.superclass) else return _attribute_definitions_blocks.compact end end |
#fields ⇒ Object
41 42 43 |
# File 'lib/trax/model/attributes/mixin.rb', line 41 def fields @fields ||= fields_module end |
#fields_module ⇒ Object
34 35 36 37 38 39 |
# File 'lib/trax/model/attributes/mixin.rb', line 34 def fields_module @fields_module ||= begin module_name = "#{self.name}::Fields" ::Trax::Core::NamedModule.new(module_name, ::Trax::Model::Attributes::Fields, :definition_context => self) end end |
#trax_attribute(name, type:, **options, &block) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/trax/model/attributes/mixin.rb', line 45 def trax_attribute(name, type:, **, &block) raise ::Trax::Model::Attributes::Errors::UnknownAttributeType.new(type: type) unless ::Trax::Model::Attributes.key?(type) if ::Trax::Model::Attributes[type].const_defined?("Mixin") attribute_type_definition_method = ::Trax::Model::Attributes[type]::Mixin::ClassMethods.instance_methods.first self.send(attribute_type_definition_method, name, **, &block) self.validates(name, [:validates]) if .key?(:validates) elsif ::Trax::Model::Attributes[type].respond_to?(:define_attribute) ::Trax::Model::Attributes[type].define_attribute(self, name, **, &block) self.validates(name, [:validates]) if .key?(:validates) else raise ::Trax::Model::Attributes::Errors::UnknownAttributeType.new(type: type) end end |