From 1e4132be21b56e47f878251bf6d02652e46222dd Mon Sep 17 00:00:00 2001 From: Brandon Blanker Lim-it Date: Tue, 14 Feb 2023 18:18:43 -0300 Subject: [PATCH] Added beforeEmit and afterEmit World callbacks (#54) * Added beforeEmit and afterEmit World callbacks * Fixed beforeEmit/afterEmit to handle recursive/nested emits; * Added preventDefaults in beforeEmit --- concord/world.lua | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/concord/world.lua b/concord/world.lua index 7008da4..7b31a6e 100644 --- a/concord/world.lua +++ b/concord/world.lua @@ -52,6 +52,8 @@ function World.new() __systemLookup = {}, __isWorld = true, + + __ignoreEmits = false }, World.__mt) -- Optimization: We deep copy the World class into our instance of a world. @@ -320,7 +322,14 @@ function World:emit(functionName, ...) self.__emitSDepth = self.__emitSDepth + 1 - local listeners = self.__events[functionName] + local listeners = self.__events[functionName] + + if not self.__ignoreEmits and Type.isCallable(self.beforeEmit) then + self.__ignoreEmits = true + local preventDefaults = self:beforeEmit(functionName, listeners, ...) + self.__ignoreEmits = false + if preventDefaults then return end + end if listeners then for i = 1, #listeners do @@ -336,6 +345,12 @@ function World:emit(functionName, ...) end end + if not self.__ignoreEmits and Type.isCallable(self.afterEmit) then + self.__ignoreEmits = true + self:afterEmit(functionName, listeners, ...) + self.__ignoreEmits = false + end + self.__emitSDepth = self.__emitSDepth - 1 return self