class Vorpal::AggregateTraversal

@private

Public Class Methods

new(configs) click to toggle source
# File lib/vorpal/aggregate_traversal.rb, line 4
def initialize(configs)
  @configs = configs
end

Public Instance Methods

accept(object, visitor, already_visited=[]) click to toggle source

Traversal should always begin with an object that is known to be able to reach all other objects in the aggregate (like the root!)

# File lib/vorpal/aggregate_traversal.rb, line 10
def accept(object, visitor, already_visited=[])
  return if object.nil?

  config = @configs.config_for(object.class)
  return if config.nil?

  return if already_visited.include?(object)
  already_visited << object

  visitor.visit_object(object, config)

  config.belongs_tos.each do |belongs_to_config|
    associate = belongs_to_config.get_associated(object)
    accept(associate, visitor, already_visited) if visitor.continue_traversal?(belongs_to_config)
  end

  config.has_ones.each do |has_one_config|
    associate = has_one_config.get_associated(object)
    accept(associate, visitor, already_visited) if visitor.continue_traversal?(has_one_config)
  end

  config.has_manys.each do |has_many_config|
    associates = has_many_config.get_associated(object)
    raise InvariantViolated.new("#{has_many_config.pretty_name} was set to nil. Use an empty array instead.") if associates.nil?
    associates.each do |associate|
      accept(associate, visitor, already_visited) if visitor.continue_traversal?(has_many_config)
    end
  end
end