class EventArgs
attr_accessor :handled
end
class Event
def initialize
@handlers = []
end
def add(&handler)
@handlers.push(handler) unless @handlers.include?(handler)
self
end
def remove(&handler)
@handlers.delete(handler) if @handlers.include?(handler)
self
end
def remove_all
@handlers.clear
self
end
def trigger(sender, args)
unless @handlers.empty?
for f in @handlers
f.call(sender, args)
break if args.handled
end
end
end
alias_method :[], :trigger
end
ev = Event.new
def handler(sender, args)
puts 'Handler 2'
end
ev.add { |sender, args| puts 'Handler 1' }
puts '------------------'
ev.trigger(self, EventArgs.new)
ev.add(&method(:handler))
puts '------------------'
ev[self, EventArgs.new]
puts '------------------'
ev.add do |sender, args|
args.handled = true
puts 'Last handler'
end
ev.add { |sender, args| puts 'should not run' }
ev[self, EventArgs.new]
puts '------------------'
ev.remove_all
ev.add { |sender, args| puts 'Sole handler' }
ev.trigger(self, EventArgs.new)