function a(object, params) params.x = params.x + 0.5 end function b(object, params) params.x = params.x + 100 end function c(object, params) params.x = params.x * 2 end function add_hook(object, name, fn, priority) local h = {name = name, fn = fn, priority = priority} object.hooks = object.hooks or {} local n = #object.hooks + 1 for i, v in ipairs(object.hooks) do if v.priority <= priority then n = i break end end table.insert(object.hooks, n, h); end function run_hooks(object, name, params) for i, v in ipairs(object.hooks) do if (v.name == name) then v.fn(object, params) if params.quit then break end end end end obj = {} add_hook(obj, "qwe", a, 100) add_hook(obj, "qwe", b, 1000) add_hook(obj, "qweqwe", c, 300) params = {x = 2} run_hooks(obj, "qwe", params) print("Result: params.x = " .. tostring(params.x))