Module: Trax::Model::Attributes::Mixin::ClassMethods

Defined in:
lib/trax/model/attributes/mixin.rb

Instance Method Summary collapse

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_blocksObject



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

#fieldsObject



41
42
43
# File 'lib/trax/model/attributes/mixin.rb', line 41

def fields
  @fields ||= fields_module
end

#fields_moduleObject



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:, **options, &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, **options, &block)
    self.validates(name, options[:validates]) if options.key?(:validates)
  elsif ::Trax::Model::Attributes[type].respond_to?(:define_attribute)
    ::Trax::Model::Attributes[type].define_attribute(self, name, **options, &block)
    self.validates(name, options[:validates]) if options.key?(:validates)
  else
    raise ::Trax::Model::Attributes::Errors::UnknownAttributeType.new(type: type)
  end
end