Diff

util/events.lua @ 11058:c99afee1c548

util.events: Add set_debug_hook() method Hook signature: ret = debug_hook(handler, event_name, event_data)
author Matthew Wild <mwild1@gmail.com>
date Thu, 03 Sep 2020 12:59:43 +0100
parent 8759:9e839fb4541a
line wrap: on
line diff
--- a/util/events.lua	Sat Aug 29 18:51:13 2020 +0200
+++ b/util/events.lua	Thu Sep 03 12:59:43 2020 +0100
@@ -26,6 +26,8 @@
 	local wrappers = {};
 	-- Event map: event_map[handler_function] = priority_number
 	local event_map = {};
+	-- Debug hook, if any
+	local active_debug_hook = nil;
 	-- Called on-demand to build handlers entries
 	local function _rebuild_index(self, event)
 		local _handlers = event_map[event];
@@ -74,11 +76,16 @@
 	end;
 	local function _fire_event(event_name, event_data)
 		local h = handlers[event_name];
-		if h then
+		if h and not active_debug_hook then
 			for i=1,#h do
 				local ret = h[i](event_data);
 				if ret ~= nil then return ret; end
 			end
+		elseif h and active_debug_hook then
+			for i=1,#h do
+				local ret = active_debug_hook(h[i], event_name, event_data);
+				if ret ~= nil then return ret; end
+			end
 		end
 	end;
 	local function fire_event(event_name, event_data)
@@ -140,6 +147,13 @@
 			end
 		end
 	end
+
+	local function set_debug_hook(new_hook)
+		local old_hook = active_debug_hook;
+		active_debug_hook = new_hook;
+		return old_hook;
+	end
+
 	return {
 		add_handler = add_handler;
 		remove_handler = remove_handler;
@@ -150,8 +164,12 @@
 			add_handler = add_wrapper;
 			remove_handler = remove_wrapper;
 		};
+
 		add_wrapper = add_wrapper;
 		remove_wrapper = remove_wrapper;
+
+		set_debug_hook = set_debug_hook;
+
 		fire_event = fire_event;
 		_handlers = handlers;
 		_event_map = event_map;