17 lines
425 B
Ruby
17 lines
425 B
Ruby
|
module RKelly
|
||
|
module Visitable
|
||
|
# Based off the visitor pattern from RubyGarden
|
||
|
def accept(visitor, &block)
|
||
|
klass = self.class.ancestors.find { |ancestor|
|
||
|
visitor.respond_to?("visit_#{ancestor.name.split(/::/)[-1]}")
|
||
|
}
|
||
|
|
||
|
if klass
|
||
|
visitor.send(:"visit_#{klass.name.split(/::/)[-1]}", self, &block)
|
||
|
else
|
||
|
raise "No visitor for '#{self.class}'"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|