# = Events # # A simple events mechanism. # # === Design: # # As always we try to keep the design simple: # Events = strings (hiearchical notation) # Handlers = named Procs # The handlers are named so that we can remove them # by name. Also usefull for documentation purposes. # # === TODO: # # Add a class of events to allow filtering of certain # events. Perhaps name can be used for this! # # code: tml # # (c) 2002-2003 Navel, all rights reserved. # $Id: events.rb 71 2004-10-18 10:50:22Z gmosx $ module N; # = EventManager # # === Example: # # $ev.event("id/user/login", user) # $ev.add_handler("id/user/login", "login-score", proc { |user| # user["score"] += 1 # }) # class EventManager attr :events attr_accessor :logger def initialize(logger = nil) @events = Hash.new @logger = logger end # Register an event handler. # # === Input: # event = the event # name = the name of the handler # proc = the proc of the hadler # def add_handler(event, name, proc) unless event_handlers = @events[event] @events[event] = event_handlers = Hash.new end event_handlers[name] = proc end # Remove the named handler from the event. # def remove_handler(event, name) if event_handlers = @events[event] event_handlers.delete(name) else $log.debug "ev: cannot remove, handler #{name} not found for event #{event}" if $DBG end end # Remove all handlers for the event. # # === Input: # event = the event # name = the name of the handler # def remove_all_handlers(event) @events[event] = Hash.new end # Fire an event # # === Input: # event = the event to fire # param = parameters for the handler, use an array # for multiple parameters. # def event(event, params) if event_handlers = @events[event] # call all event handler procs for handler in event_handlers.values # call the handler with the params. handler.call(params) end end if @logger if params.is_a?(Array) pstr = params.collect{|i| i.to_s()}.join(", ") else pstr = params.to_s() end @logger.info("#{event}: #{pstr}") end end alias_method :fire, :event end # # # class Event @@manager = EventManager.new() def self.add_handler(event, name, proc) end def self.fire(event, params) @@manager.fire(event, params) end end end # module