Module: Eavi::Visitor

Defined in:
lib/eavi/visitor.rb

Overview

Extend a module/class or include a class with Visitor to make it a dynamic visitor (see the OOP visitor pattern).

Defined Under Namespace

Modules: ModuleDSL, ModuleMethods, ModuleMethodsWhenExtended, ModuleMethodsWhenIncluded

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(visitor) ⇒ Object



25
26
27
28
29
# File 'lib/eavi/visitor.rb', line 25

def extended(visitor)
  visitor.extend(ModuleDSL)
  visitor.extend(ModuleMethods)
  visitor.extend(ModuleMethodsWhenExtended)
end

.included(visitor) ⇒ Object



19
20
21
22
23
# File 'lib/eavi/visitor.rb', line 19

def included(visitor)
  visitor.extend(ModuleDSL)
  visitor.extend(ModuleMethods)
  visitor.extend(ModuleMethodsWhenIncluded)
end

Instance Method Details

#visit(object, *args, as: object.class) ⇒ Object

Call the visit method associated with the type of object.

Raises:



9
10
11
12
13
14
15
16
# File 'lib/eavi/visitor.rb', line 9

def visit(object, *args, as: object.class)
  as.ancestors.each do |type|
    visit_method_name = VisitMethodHelper.gen_name(type)
    next unless respond_to?(visit_method_name)
    return send(visit_method_name, object, *args)
  end
  raise NoVisitMethodError.new(self, object, as)
end