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
-
#accept(visitor, *args) ⇒ Object
accepts a visitor object, recursively applys to object and all children in the hierarchy.
-
#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).
-
#compare_hierarchy(reference_obj) ⇒ Object
calls default visit_with_reference method defined in Visitor.
- #default_visitor ⇒ Object
-
#hierarchy ⇒ Object
calls default visit method defined in Visitor above.
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_visitor ⇒ Object
19 |
# File 'lib/vampire/vampire.rb', line 19 def default_visitor; Visitor.new(self); end |
#hierarchy ⇒ Object
calls default visit method defined in Visitor above
22 |
# File 'lib/vampire/vampire.rb', line 22 def hierarchy; accept(default_visitor); end |