Module: Vampire

Defined in:
lib/vampire/vampire.rb,
lib/vampire/version.rb

Defined Under Namespace

Classes: Visitor

Constant Summary collapse

VERSION =
"0.0.1"

Instance Method Summary collapse

Instance Method Details

#accept(visitor, *args) ⇒ Object

accepts a visitor object, recursively applys to object and all children in the hierarchy



28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/vampire/vampire.rb', line 28

def accept visitor, *args
  child_vals = []

  parent_val = [visitor.visit(self, *args)]
  if respond_to?(:children) && children
    visitor.depth += 1
    children.each do |child|
      visitor.node += 1
      child_vals << child.accept(visitor, *args)
    end
    visitor.depth -= 1
  end
  child_vals.any? ? parent_val + child_vals : parent_val
end

#accept_with_reference(visitor, reference_obj, *args) ⇒ Object

recursively apply visitor, using another object with a similar hierarchy as a reference typically this would be used to check for equality (checkout the “compare” method above for a way to do this without having to create a custom visitor)



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/vampire/vampire.rb', line 46

def accept_with_reference visitor, reference_obj, *args
  child_vals = []

  parent_val = [visitor.visit_with_reference(self, reference_obj, *args)]
  if respond_to?(:children) && children && reference_obj.respond_to?(:children) && reference_obj.children
    visitor.depth += 1
    reference_obj.children.each_with_index do |ref_child, i|
      if child = children[i]
        visitor.node += 1
        child_vals << child.accept_with_reference(visitor, ref_child, *args)
      end
    end
    visitor.depth -= 1
  end
  child_vals.any? ? parent_val + child_vals : parent_val    
end

#compare_hierarchy(reference_obj) ⇒ Object

calls default visit_with_reference method defined in Visitor



25
# File 'lib/vampire/vampire.rb', line 25

def compare_hierarchy(reference_obj); accept_with_reference(default_visitor, reference_obj);  end

#default_visitorObject



19
# File 'lib/vampire/vampire.rb', line 19

def default_visitor; Visitor.new(self); end

#hierarchyObject

calls default visit method defined in Visitor above



22
# File 'lib/vampire/vampire.rb', line 22

def hierarchy; accept(default_visitor); end