function a(object, params) print("calling a, params.x = " .. tostring(params.x)) params.x = params.x + 0.5 end function b(object, params) print("calling b, params.x = " .. tostring(params.x)) end function c(object, params) print("calling a, params.x = " .. tostring(params.x)) params.x = params.x * 2 end function add_hook(object, name, fn, priority) local h = {} h.name = name h.fn = fn object.hooks = object.hooks or {} object.hooks[priority] = object.hooks[priority] or {} object.hooks[priority][#object.hooks[priority] + 1] = h end function run_hooks(object, name, params) local p = params for i, v in pairs(object.hooks) do print('Found new priority: (i, v) = (' .. tostring(i) .. ', ' .. tostring(v) .. ')') if (v[1].name == name) then for j, h in ipairs(v) do h.fn(object, p) if p.quit then break end end if p.quit then break end end end end obj = {} add_hook(obj, "qwe", a, 100) add_hook(obj, "qwe", b, 200) add_hook(obj, "qweqwe", c, 300) run_hooks(obj, "qwe", {x = 2})