local hooks, overrides, M = {}, {}, {}; local allowed_hooks = { "install_plugins", "setup_mappings", "ready", } local function has_value (tab, val) for _, value in ipairs(tab) do if value == val then return true end end return false end M.add = function(name, fn) if not(has_value(allowed_hooks, name)) then error("Custom lua uses unallowed hook " .. name) end if hooks[name] == nil then hooks[name] = {} end table.insert(hooks[name], fn); end M.run = function(name, args) if hooks[name] == nil then return; end for _, hook in pairs(hooks[name]) do hook(args) end end M.createOverrides = function(module) local O = {}; O.get = function(name, default) local current = default; if overrides[module] and overrides[module][name] then if type(overrides[module][name]) == "function" then current = overrides[module][name] elseif type(overrides[module][name]) == "table" then for _, override in pairs(overrides[module][name]) do current = override(current) end end end return current; end return O; end M.override = function(module, name, overwrite) if overrides[module] == nil then overrides[module] = {}; end if overrides[module][name] == nil then overrides[module][name] = {}; end table.insert(overrides[module][name], overwrite) end return M;