Sha256: f66f76d2a3c4c800b5a2cf67e38a60054244622048f78dd4ebadc8e2194bd673

Contents?: true

Size: 1.92 KB

Versions: 16

Compression:

Stored size: 1.92 KB

Contents

module Xcake
  # 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.
  #
  # @example Implementing Visitor Pattern
  #
  #          class Writer
  #
  #             include Visitor
  #
  #             def visit_page
  #               #Write Page
  #             end
  #
  #             def leave_page
  #               #Append Footer
  #             end
  #          end
  #
  module Visitor

    # 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.
    #
    # @param [Visitable] visitable
    #                    the visitable item the visitor is visiting
    #
    def visit(item)
      item_name = item_name(item)

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

    # 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.
    #
    # @param [Visitable] visitable
    #                    the visitable item the visitor has left
    #
    def leave(item)
      item_name = item_name(item)

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

    private

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

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

      class_name.downcase!
    end
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
xcake-0.6.19 lib/xcake/visitor.rb
xcake-0.6.18 lib/xcake/visitor.rb
xcake-0.6.17 lib/xcake/visitor.rb
xcake-0.6.16 lib/xcake/visitor.rb
xcake-0.6.14 lib/xcake/visitor.rb
xcake-0.6.13 lib/xcake/visitor.rb
xcake-0.6.12 lib/xcake/visitor.rb
xcake-0.6.11 lib/xcake/visitor.rb
xcake-0.6.10 lib/xcake/visitor.rb
xcake-0.6.9 lib/xcake/visitor.rb
xcake-0.6.8 lib/xcake/visitor.rb
xcake-0.6.7 lib/xcake/visitor.rb
xcake-0.6.6 lib/xcake/visitor.rb
xcake-0.6.5 lib/xcake/visitor.rb
xcake-0.6.4 lib/xcake/visitor.rb
xcake-0.6.2 lib/xcake/visitor.rb