32 lines
671 B
Ruby
32 lines
671 B
Ruby
|
module RKelly
|
||
|
module Visitors
|
||
|
class PointcutVisitor < Visitor
|
||
|
attr_reader :matches
|
||
|
def initialize(pattern, matches = [])
|
||
|
@pattern = pattern
|
||
|
@matches = matches
|
||
|
end
|
||
|
|
||
|
def >(pattern)
|
||
|
pattern =
|
||
|
case pattern
|
||
|
when Class
|
||
|
pattern.new(Object)
|
||
|
else
|
||
|
pattern
|
||
|
end
|
||
|
self.class.new(nil, @matches.map do |m|
|
||
|
m.pointcut(pattern).matches
|
||
|
end.flatten)
|
||
|
end
|
||
|
|
||
|
ALL_NODES.each do |type|
|
||
|
define_method(:"visit_#{type}Node") do |o|
|
||
|
@matches << o if @pattern === o
|
||
|
super(o)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|