Module: Flatter::Mapper::Traits

Extended by:
ActiveSupport::Concern
Included in:
Flatter::Mapper
Defined in:
lib/flatter/mapper/traits.rb

Defined Under Namespace

Modules: ClassMethods, FactoryMethods

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object



146
147
148
149
150
151
152
153
# File 'lib/flatter/mapper/traits.rb', line 146

def method_missing(name, *args, &block)
  if trait?
    mounter.send(name, *args, &block)
  else
    trait = trait_mountings.detect{ |trait| trait.shared_methods.include?(name) }
    trait ? trait.send(name, *args, &block) : super
  end
end

Instance Method Details

#extend_with(extension) ⇒ Object



56
57
58
# File 'lib/flatter/mapper/traits.rb', line 56

def extend_with(extension)
  singleton_class.trait :extension, &extension
end

#full_nameObject



74
75
76
77
78
79
80
# File 'lib/flatter/mapper/traits.rb', line 74

def full_name
  if name == 'extension_trait'
    super
  else
    name
  end
end

#initialize(target, *traits, &block) ⇒ Object



49
50
51
52
53
54
# File 'lib/flatter/mapper/traits.rb', line 49

def initialize(target, *traits, **, &block)
  super

  set_traits(traits)
  extend_with(block) if block.present?
end

#respond_to_missing?(name) ⇒ Boolean

Returns:

  • (Boolean)


138
139
140
141
142
143
144
# File 'lib/flatter/mapper/traits.rb', line 138

def respond_to_missing?(name, *)
  return false if trait?

  trait_mountings.any? do |trait|
    trait.shared_methods.include?(name)
  end
end

#set_target(target) ⇒ Object



60
61
62
63
64
65
66
67
# File 'lib/flatter/mapper/traits.rb', line 60

def set_target(target)
  if trait?
    mounter.set_target(target)
  else
    super
    trait_mountings.each{ |trait| trait.set_target!(target) }
  end
end

#set_traits(traits) ⇒ Object



117
118
119
# File 'lib/flatter/mapper/traits.rb', line 117

def set_traits(traits)
  @traits = traits
end

#shared_methodsObject



134
135
136
# File 'lib/flatter/mapper/traits.rb', line 134

def shared_methods
  self.class.public_instance_methods(false)
end

#trait!Object



125
126
127
# File 'lib/flatter/mapper/traits.rb', line 125

def trait!
  @trait = true
end

#trait?Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/flatter/mapper/traits.rb', line 121

def trait?
  !!@trait
end

#trait_namesObject



113
114
115
# File 'lib/flatter/mapper/traits.rb', line 113

def trait_names
  traits.map{ |trait| "#{trait.to_s}_trait" }
end

#traitsObject



109
110
111
# File 'lib/flatter/mapper/traits.rb', line 109

def traits
  @traits ||= []
end