From: Payton Swick Date: 2006-02-02T22:34:54+09:00 Subject: Re: callbacks, events, notification in general Usage, by the way: class A include HandlesEvents end a = A.new a.on_event(:hello, :hi) { puts "Hello world!" } a.handle(:hello) # => prints "Hello world!" -Payton Payton Swick wrote: > Not sure if it's any help, but here's something I've been using in my > code which is sort of the reverse of Observable. > > This is actually just a snippet of the whole thing without comments or > some fancy features I added. I may put it up as a gem if there's interest. > > module HandlesEvents > attr_reader :handlers > > def on_event(*triggers, &handler) > @handlers ||= Hash.new > triggers.each { |trigger| @handlers[trigger] = handler } > end > > def handles?(trigger) > @handlers ||= Hash.new > return true unless @handlers[trigger].nil? > false > end > > def handle(trigger) > @handlers ||= Hash.new > @handlers[trigger].call(trigger) unless @handlers[trigger].nil? > end > end > > -Payton > > Damphyr wrote: > >> OK, bare with me, this is brainstorming of a sorts: >> I want to have some kind of event notification from my classes. >> Typically what I would do would be to pass a logger object and let the >> class log by itself, but I'm not really satisfied with this solution in >> most cases. >> >> What I would prefer was define a callback method and give this to the >> object. Then I could do whatever I want with it and not only use logs. >> Mostly I want to have progress reports. >> >> something like >> >> class A >> def set_callback notify >> @notify=notify >> end >> def something >> puts "something" >> send(@notify) if @notify >> end >> end >> >> def coocoo >> puts "hey" >> end >> a=A.new >> a.something >> a.set_callback(:coocoo) >> a.something >> >> Now this does exactly what I want and can be wrapped up in a module to >> be included for general use. >> Question: Is there a "better" solution? What are my alternatives? >> Cheers, >> V.-