From 28e56af503b1088bf6f62e438e9b06c9e3e1a12f Mon Sep 17 00:00:00 2001
From: Matthew Wild <mwild1@gmail.com>
Date: Sat, 19 May 2012 15:39:16 +0100
Subject: modulemanager, moduleapi: Turn module.event_handlers into a
 multitable and track object->event->handler associations correctly (thanks
 Zash)

---
 core/moduleapi.lua     |  7 +------
 core/modulemanager.lua | 13 +++++++------
 2 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/core/moduleapi.lua b/core/moduleapi.lua
index 96f1d3ea..24d29dfe 100644
--- a/core/moduleapi.lua
+++ b/core/moduleapi.lua
@@ -70,12 +70,7 @@ function api:fire_event(...)
 end
 
 function api:hook_object_event(object, event, handler, priority)
-	local handlers = self.event_handlers[event];
-	if not handlers then
-		handlers = {};
-		self.event_handlers[event] = handlers;
-	end
-	handlers[event] = { handler = handler, priority = priority, object = object };
+	self.event_handlers:set(object, event, handler, true);
 	return object.add_handler(event, handler, priority);
 end
 
diff --git a/core/modulemanager.lua b/core/modulemanager.lua
index 417dedbe..488319c3 100644
--- a/core/modulemanager.lua
+++ b/core/modulemanager.lua
@@ -10,6 +10,9 @@ local logger = require "util.logger";
 local log = logger.init("modulemanager");
 local config = require "core.configmanager";
 local pluginloader = require "util.pluginloader";
+local set = require "util.set";
+
+local new_multitable = require "util.multitable".new;
 
 local hosts = hosts;
 local prosody = prosody;
@@ -26,8 +29,6 @@ pcall = function(f, ...)
 	return xpcall(function() return f(unpack(params, 1, n)) end, function(e) return tostring(e).."\n"..debug_traceback(); end);
 end
 
-local set = require "util.set";
-
 local autoload_modules = {"presence", "message", "iq", "offline", "c2s", "s2s"};
 local component_inheritable_modules = {"tls", "dialback", "iq", "s2s"};
 
@@ -91,8 +92,8 @@ local function do_unload_module(host, name)
 		end
 	end
 	
-	for event, data in pairs(mod.module.event_handlers) do
-		data.object.remove_handler(event, data.handler);
+	for object, event, handler in mod.module.event_handlers:iter(nil, nil, nil) do
+		object.remove_handler(event, handler);
 	end
 	
 	if mod.module.items then -- remove items
@@ -132,7 +133,7 @@ local function do_load_module(host, module_name)
 		if module_has_method(mod, "add_host") then
 			local _log = logger.init(host..":"..module_name);
 			local host_module_api = setmetatable({
-				host = host, event_handlers = {}, items = {};
+				host = host, event_handlers = new_multitable(), items = {};
 				_log = _log, log = function (self, ...) return _log(...); end;
 			},{
 				__index = modulemap["*"][module_name].module;
@@ -159,7 +160,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, event_handlers = {} }
+		_log = _log, log = function (self, ...) return _log(...); end, event_handlers = new_multitable() }
 		, { __index = api });
 
 	local pluginenv = setmetatable({ module = api_instance }, { __index = _G });
-- 
cgit v1.2.3