local event_responder = {};
local event_audience = {};
function get_all_audiences()
return event_audience;
end
function get_all_responders()
return event_responder;
end
function raise_issue(event, ...)
local info, f, result, ret = nil, nil, {}, nil
local nodes = event_responder[event] or {}
for listener, node in pairs(nodes) do
f = node["func"];
if type(f) == "function" then
ret = call_func(f, node["args"], ...)
if ret then
table.insert(result, ret)
return result
end
end
end
local nodes = event_audience[event] or {}
for listener, node in pairs(nodes) do
f = node["func"];
if type(f) == "function" then
ret = call_func(f, node["args"], ...)
if ret then
table.insert(result, ret)
end
end
end
return result
end
local function register_by_type(event_struct, listener, event_routines)
for event, info in pairs(event_routines) do
local func = info
local args = {}
if type(func) ~= "function" then
func = info["func"]
args = info["args"]
end
assert(type(func) == "function")
event_struct[event] = event_struct[event] or {}
event_struct[event][listener] = {func = func, args = args}
end
end
function register_as_audience(listener, event_routines)
register_by_type(event_audience, listener, event_routines)
end
function register_as_responder(listener, event_routines)
register_by_type(event_responder, listener, event_routines)
end
local function remove_by_type(event_struct, listener, events)
assert(listener ~= nil, "listener must no nil")
if not events then
for event,node in pairs(event_struct) do
node[listener] = nil
end
return
end
for _, event in ipairs(events) do
if event_struct[event] then
event_struct[event][listener] = nil
end
end
end
function remove_audience_from_raiser(listener, events)
remove_by_type(event_audience, listener, events)
end
function remove_responder_from_raiser(listener, events)
remove_by_type(event_responder, listener, events)
end