[ create a new paste ] login | about

Link: http://codepad.org/Uie5Q2FN    [ raw code | output | fork ]

Ruby, pasted on Feb 9:
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)


Output:
1
2
3
4
5
6
7
8
9
10
11
------------------
Handler 1
------------------
Handler 1
Handler 2
------------------
Handler 1
Handler 2
Last handler
------------------
Sole handler


Create a new paste based on this one


Comments: