Class: Composition::Compositions::ComposedFrom

Inherits:
Composition
  • Object
show all
Defined in:
lib/composition/compositions/composed_from.rb

Instance Attribute Summary

Attributes inherited from Composition

#name

Instance Method Summary collapse

Methods inherited from Composition

#class_name, #initialize, #inverse_of, #klass

Constructor Details

This class inherits a constructor from Composition::Compositions::Composition

Instance Method Details

#aliasesObject



42
43
44
# File 'lib/composition/compositions/composed_from.rb', line 42

def aliases
  mapping.values
end

#attributes(obj) ⇒ Object

TODO: Add documentation



31
32
33
34
35
36
37
38
39
40
# File 'lib/composition/compositions/composed_from.rb', line 31

def attributes(obj)
  aliases.each_with_object({}) do |attr, memo|
    value = obj.send(attr)
    if value.respond_to?(:attributes)
      memo[attr] = value.send(:attributes)
    else
      memo[attr] = value
    end
  end
end

#setter(obj, setter_attr, setter_value) ⇒ Object

For a composition defined like:

class User < ActiveRecord::Base
  compose :credit_card,
          mapping: {
            credit_card_name: :name,
            credit_card_brand: :brand
          }
end

class CreditCard < Composition::Base
  composed_from :user
end

The setter method will be in charge of implementing @credit_card.name= and @credit_card.brand=.

If calling @credit_card.name= it will take care of updating the @name instance variable in @credit_card, but also will take care of keeping @user.credit_card_name in sync with it.



24
25
26
27
28
# File 'lib/composition/compositions/composed_from.rb', line 24

def setter(obj, setter_attr, setter_value)
  set_instance_variable(obj, setter_attr, setter_value)
  set_parent_attribute(obj, setter_attr, setter_value)
  setter_value
end