class ActiveShepherd::Traversal

Attributes

associations[R]
attributes[R]
visitor[R]

Public Class Methods

new(visitor, params = {}) click to toggle source
# File lib/active_shepherd/traversal.rb, line 4
def initialize(visitor, params = {})
  @associations = params[:associations]
  @attributes   = params[:attributes]
  @visitor      = visitor
end

Public Instance Methods

traverse() click to toggle source
# File lib/active_shepherd/traversal.rb, line 10
def traverse
  attributes.each do |attribute_name, object|
    visit :handle_attribute, attribute_name, object
  end

  associations.each do |name, (reflection, object)|
    if reflection.macro == :has_many
      visit :handle_has_many_association, reflection, object
    elsif reflection.macro == :has_one
      visit :handle_has_one_association, reflection, object
    end
  end
end
visit(method_name, arg1, arg2) click to toggle source
# File lib/active_shepherd/traversal.rb, line 24
def visit(method_name, arg1, arg2)
  if visitor.respond_to? method_name
    if visitor.method(method_name).arity == 2
      visitor.public_send method_name, arg1, arg2
    else
      visitor.public_send method_name, arg1, *Array.wrap(arg2)
    end
  end
end