2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
11 local t_insert = table.insert;
12 local t_sort = table.sort;
13 local setmetatable = setmetatable;
21 local function _rebuild_index(handlers, event)
22 local _handlers = event_map[event];
23 if not _handlers or next(_handlers) == nil then return; end
25 for handler in pairs(_handlers) do
26 t_insert(index, handler);
28 t_sort(index, function(a, b) return _handlers[a] > _handlers[b]; end);
29 handlers[event] = index;
32 setmetatable(handlers, { __index = _rebuild_index });
33 local function add_handler(event, handler, priority)
34 local map = event_map[event];
36 map[handler] = priority or 0;
38 map = {[handler] = priority or 0};
39 event_map[event] = map;
41 handlers[event] = nil;
43 local function remove_handler(event, handler)
44 local map = event_map[event];
47 handlers[event] = nil;
50 local function add_handlers(handlers)
51 for event, handler in pairs(handlers) do
52 add_handler(event, handler);
55 local function remove_handlers(handlers)
56 for event, handler in pairs(handlers) do
57 remove_handler(event, handler);
60 local function fire_event(event, ...)
61 local h = handlers[event];
64 local ret = h[i](...);
65 if ret ~= nil then return ret; end
70 add_handler = add_handler;
71 remove_handler = remove_handler;
72 add_handlers = add_handlers;
73 remove_handlers = remove_handlers;
74 fire_event = fire_event;
76 _event_map = event_map;