util.pluginloader: Remove unnecessary return value suppressing the real load error
[prosody.git] / util / events.lua
index b1f3811ca13b2a23231dfec3eb81336bdf791827..3816f30b0d13cd660f609288835c6463feab4074 100644 (file)
@@ -2,6 +2,7 @@
 local ipairs = ipairs;\r
 local pairs = pairs;\r
 local t_insert = table.insert;\r
+local t_sort = table.sort;\r
 local select = select;\r
 \r
 module "events"\r
@@ -10,32 +11,32 @@ function new()
        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
+       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)\r
+       local function add_handler(event, handler, priority)\r
                local map = event_map[event];\r
                if map then\r
-                       map[handler] = true;\r
+                       map[handler] = priority or 0;\r
                else\r
-                       map = {[handler] = true};\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
@@ -51,9 +52,10 @@ function new()
        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
-                               handler(data);\r
+                               local ret = handler(...);\r
+                               if ret ~= nil then return ret; end\r
                        end\r
                end;\r
                dispatchers[event] = dispatcher;\r
@@ -62,11 +64,12 @@ function new()
        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
-                               handler(data);\r
+                               local ret = handler(...);\r
+                               if ret ~= nil then return ret; end\r
                        end\r
                end\r
        end;\r