modulemanager: load(): Return and use the correct module object
[prosody.git] / core / modulemanager.lua
index 9f90e34ea8688ba123aecf10648c460a1ee13030..a192e6372902e4aada59c98d28ba92fa6ef7f40f 100644 (file)
@@ -9,8 +9,6 @@
 local logger = require "util.logger";
 local log = logger.init("modulemanager");
 local config = require "core.configmanager";
-local multitable_new = require "util.multitable".new;
-local st = require "util.stanza";
 local pluginloader = require "util.pluginloader";
 
 local hosts = hosts;
@@ -46,12 +44,9 @@ module "modulemanager"
 
 local api = _G.require "core.moduleapi"; -- Module API container
 
+-- [host] = { [module] = module_env }
 local modulemap = { ["*"] = {} };
 
-local modulehelpers = setmetatable({}, { __index = _G });
-
-local hooks = multitable_new();
-
 local NULL = {};
 
 -- Load modules when a host is activated
@@ -100,19 +95,11 @@ local function do_unload_module(host, name)
                        log("warn", "Non-fatal error unloading module '%s' on '%s': %s", name, host, err);
                end
        end
-       -- unhook event handlers hooked by module:hook
-       for event, handlers in pairs(hooks:get(host, name) or NULL) do
-               for handler in pairs(handlers or NULL) do
-                       (hosts[host] or prosody).events.remove_handler(event, handler);
-               end
-       end
-       -- unhook event handlers hooked by module:hook_global
-       for event, handlers in pairs(hooks:get("*", name) or NULL) do
-               for handler in pairs(handlers or NULL) do
-                       prosody.events.remove_handler(event, handler);
-               end
+       
+       for handler, event in pairs(mod.module.event_handlers) do
+               event.object.remove_handler(event.name, handler);
        end
-       hooks:remove(host, name);
+       
        if mod.module.items then -- remove items
                for key,t in pairs(mod.module.items) do
                        for i = #t,1,-1 do
@@ -153,7 +140,7 @@ local function do_load_module(host, module_name)
 
        local _log = logger.init(host..":"..module_name);
        local api_instance = setmetatable({ name = module_name, host = host, path = err,
-               _log = _log, log = function (self, ...) return _log(...); end }
+               _log = _log, log = function (self, ...) return _log(...); end, event_handlers = {} }
                , { __index = api });
 
        local pluginenv = setmetatable({ module = api_instance }, { __index = _G });
@@ -183,7 +170,7 @@ local function do_load_module(host, module_name)
                log("error", "Error initializing module '%s' on '%s': %s", module_name, host, err or "nil");
                do_unload_module(api_instance.host, module_name); -- Ignore error, module may be partially-loaded
        end
-       return ok and mod, err;
+       return ok and pluginenv, err;
 end
 
 local function do_reload_module(host, name)
@@ -197,7 +184,6 @@ local function do_reload_module(host, name)
        end
 
        local saved;
-
        if module_has_method(mod, "save") then
                local ok, ret, err = call_module_method(mod, "save");
                if ok then
@@ -233,7 +219,7 @@ end
 function load(host, name)
        local mod, err = do_load_module(host, name);
        if mod then
-               (hosts[mod.host] or prosody).events.fire_event("module-loaded", { module = module_name, host = host });
+               (hosts[mod.module.host] or prosody).events.fire_event("module-loaded", { module = name, host = host });
        end
        return mod, err;
 end