local dispatchers = {};\r
local handlers = {};\r
local event_map = {};\r
- local function _rebuild_index() -- TODO optimize index rebuilding\r
- for event, _handlers in pairs(event_map) do\r
- local index = handlers[event];\r
- if index then\r
- for i=#index,1,-1 do index[i] = nil; end\r
- else index = {}; handlers[event] = index; end\r
- for handler in pairs(_handlers) do\r
- t_insert(index, handler);\r
- end\r
- t_sort(index, function(a, b) return _handlers[a] > _handlers[b]; end);\r
+ local function _rebuild_index(event) -- TODO optimize index rebuilding\r
+ local _handlers = event_map[event];\r
+ local index = handlers[event];\r
+ if index then\r
+ for i=#index,1,-1 do index[i] = nil; end\r
+ else index = {}; handlers[event] = index; end\r
+ for handler in pairs(_handlers) do\r
+ t_insert(index, handler);\r
end\r
+ t_sort(index, function(a, b) return _handlers[a] > _handlers[b]; end);\r
end;\r
local function add_handler(event, handler, priority)\r
local map = event_map[event];\r
map = {[handler] = priority or 0};\r
event_map[event] = map;\r
end\r
- _rebuild_index();\r
+ _rebuild_index(event);\r
end;\r
local function remove_handler(event, handler)\r
local map = event_map[event];\r
if map then\r
map[handler] = nil;\r
- _rebuild_index();\r
+ _rebuild_index(event);\r
end\r
end;\r
local function add_plugin(plugin)\r
local function _create_dispatcher(event) -- FIXME duplicate code in fire_event\r
local h = handlers[event];\r
if not h then h = {}; handlers[event] = h; end\r
- local dispatcher = function(data)\r
+ local dispatcher = function(...)\r
for _, handler in ipairs(h) do\r
- local ret = handler(data);\r
+ local ret = handler(...);\r
if ret ~= nil then return ret; end\r
end\r
end;\r
local function get_dispatcher(event)\r
return dispatchers[event] or _create_dispatcher(event);\r
end;\r
- local function fire_event(event, data) -- FIXME duplicates dispatcher code\r
+ local function fire_event(event, ...) -- FIXME duplicates dispatcher code\r
local h = handlers[event];\r
if h then\r
for _, handler in ipairs(h) do\r
- local ret = handler(data);\r
+ local ret = handler(...);\r
if ret ~= nil then return ret; end\r
end\r
end\r