Module: Xcake::Visitor

Included in:
Generator
Defined in:
lib/xcake/visitor.rb

Overview

This namespace provides all of methods for implementing the Vistor in the Visitor pattern.

This implementation has a slight twist where a visitor knows when it has "left" an object it is visiting.

Classes implementing these methods should add methods visit_<visitable classname> and leave_<visitable classname> for each visitable they intend to use that class with.

Examples:

Implementing Visitor Pattern


class Writer

   include Visitor

   def visit_page
     #Write Page
   end

   def leave_page
     #Append Footer
   end
end

Instance Method Summary collapse

Instance Method Details

#item_name(item) ⇒ Object (private)



68
69
70
71
72
73
74
75
# File 'lib/xcake/visitor.rb', line 68

def item_name(item)
  class_name = item.class.to_s

  class_name.gsub!('Xcake::', '')
  class_name.gsub!('::', '_')

  class_name.downcase!
end

#leave(item) ⇒ Object

This is called when a visitor is leaving a visitable item.

By default this method calls the method leave_<visitable classname> so make sure you've created a method for each visitable you intend to visit.

Parameters:

  • visitable (Visitable)

    the visitable item the visitor has left



59
60
61
62
63
64
# File 'lib/xcake/visitor.rb', line 59

def leave(item)
  item_name = item_name(item)

  method = "leave_#{item_name}"
  send(method, item) if respond_to? method
end

#visit(item) ⇒ Object

This is called when a visitor is visiting a visitable item.

By default this method calls the method visit_<visitable classname> so make sure you've created a method for each visitable you intend to visit.

Parameters:

  • visitable (Visitable)

    the visitable item the visitor is visiting



41
42
43
44
45
46
# File 'lib/xcake/visitor.rb', line 41

def visit(item)
  item_name = item_name(item)

  method = "visit_#{item_name}"
  send(method, item) if respond_to? method
end