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
This commit is contained in:
Brandon Blanker Lim-it 2023-02-14 18:18:43 -03:00 committed by Pablo Ariel Mayobre
parent 429a448ab6
commit 1e4132be21

View file

@ -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.
@ -322,6 +324,13 @@ function World:emit(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
local listener = listeners[i]
@ -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