Sha256: e7ff4f6cd39bc799e7d489dcd1f3d31ed2954b10d74dc33c03a58ec1aa8f233f

Contents?: true

Size: 1.87 KB

Versions: 19

Compression:

Stored size: 1.87 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)
    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)
    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

19 entries across 19 versions & 1 rubygems

Version Path
xcake-0.5.3 lib/xcake/visitor.rb
xcake-0.5.2 lib/xcake/visitor.rb
xcake-0.5.1 lib/xcake/visitor.rb
xcake-0.5.0 lib/xcake/visitor.rb
xcake-0.4.8 lib/xcake/visitor.rb
xcake-0.4.7 lib/xcake/visitor.rb
xcake-0.4.6 lib/xcake/visitor.rb
xcake-0.4.5 lib/xcake/visitor.rb
xcake-0.4.4 lib/xcake/visitor.rb
xcake-0.4.3 lib/xcake/visitor.rb
xcake-0.4.2 lib/xcake/visitor.rb
xcake-0.4.1 lib/xcake/visitor.rb
xcake-0.3.1 lib/xcake/visitor.rb
xcake-0.3.0 lib/xcake/visitor.rb
xcake-0.1.9 lib/xcake/visitor.rb
xcake-0.1.8 lib/xcake/visitor.rb
xcake-0.1.7 lib/xcake/visitor.rb
xcake-0.1.6 lib/xcake/visitor.rb
xcake-0.1.5 lib/xcake/visitor.rb