module TaskList def self.included(base) base.extend Events base.send :include, Events end module Events def events @events ||= Hash.new {|h,k| h[k] = []} end def task(event, block) event = event.to_s events[event] << block end end protected def fire(event, *args) (self.class.events[event.to_s] + events[event.to_s]).map {|task| task.call(self, args) } end end