Ф-ции записываются в таблицы, а таблицы одна в другую, у каждой таблицы в метатаблице указано, что при вызове оной выполнится ф-ция и вложенная таблица и так по цепочке:
local noop = function() end
local storage = {noop}
setmetatable(storage, {__call = function(slf, ...) return slf[1](...) end})
local b = storage
function add(f) -- добавить ф-цию в линию выполнения
local texe = {noop, f}
setmetatable(texe, {__call = function(self, ...)
self[2](...);
return self[1](...)
end})
b[1] = texe
b = texe
end
function find(f_obj) -- поиск ф-ции из линии, если нашлась - возвращает её родительскую таблицу (сама найденная ф-ция 2 элемент в таблице)
local stack, prevStack = storage, storage
while (type(stack) == "table") do
stack = stack[1]
if stack[2] == f_obj then
return prevStack
end
prevStack = stack
end
end -- не громоздкий поиск ф-ции в линии
function del(fun) -- удаление ф-ции из линии
local a = find(fun)
a[1] = a[1][1]
end