|
|
-- --- T2-COPYRIGHT-NOTE-BEGIN --- -- This copyright note is auto-generated by ./scripts/Create-CopyPatch. -- -- T2 SDE: misc/lua/sde/hooks.lua -- Copyright (C) 2005 - 2006 The T2 SDE Project -- Copyright (C) 2005 - 2006 Juergen "George" Sawinski -- -- More information can be found in the files COPYING and README. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; version 2 of the License. A copy of the -- GNU General Public License can be found in the file COPYING. -- --- T2-COPYRIGHT-NOTE-END ---
-- TODO: -- - add "protected" hooks (hooks, that can't be overriden simply)
-- DESCRIPTION: -- 1. Create a new hook -- h = hook() or h = hook.new() -- -- 2. Using hooks -- -- Access to the hooks with a given hook level (from 1 to 9): -- h[num]:add(function-or-string) -- Add a function to the hook with a hook level (num). -- -- h[num]:set(function-or-string) -- Replace the contents of hook-order "num" with a new function -- -- h[num]:clear() -- Clear all hooks. -- -- h[num]:run() -- Run a specific hook level -- -- Access without hook level: -- h:add(function-or-string) -- Equivalent to h[5]:add(function-or-string) -- -- h:set(function-or-string) -- Equivalent to h[5]:set(function-or-string), however, clears -- all other levels -- -- h:clear() -- Clear all hooks in all levels. -- -- h:run() -- Execute the hooks in all levels, starting at hook level 1.
-- INTERFACE ----------------------------------------------------------------- hook = { level = {} } meta = {}
function hook.new() local h = hook return setmetatable(h, meta) end
function hook:add(data) self[5]:add(data) end
function hook:set(data) self:clear() self[5]:set(data) end
function hook:run() for _,l in pairs(self.level) do l:run() end end
function hook:clear() for _,l in pairs(self.level) do l:clear() end end
-- h = hook() setmetatable(hook, { __call = hook.new })
-- INTERNAL HOOKS __hook ----------------------------------------------------- local __hook = {} local __meta = { __index = {} }
-- create a new __hook function __hook.new() local h = { hooks = {} } return setmetatable(h, __meta) end
-- __hook.add(hook-table, function-or-string) -- add a function to the __hook function __hook.add(h, data) if type(data) == "table" then for _,f in pairs(data) do __hook.add(h, f) end return end
-- insert hook if type(data) == "function" then table.insert(h.hooks, data) elseif type(data) == "string" then local f = loadstring(data) table.insert(h.hooks, f) else assert(type(data) == "function", "function or string expected in hook.add(table, pos, function-or-string)") end end
-- __hook.set(hook-table, function-or-string-or-nil) -- add a function to the __hook function __hook.set(h, data) h.hooks = {} __hook.add(h, data) end
-- __hook.run(hook-table) -- execute the hooks function __hook.run(h) for _,f in pairs(h.hooks) do if f then f() end end end
-- __hook.clear(hook-table) -- clear all hooks function __hook.clear(h) h.hooks = {} end
-- METATABLE ----------------------------------------------------------------- function __meta.__index:add(data) __hook.add(self, data) end function __meta.__index:set(data) __hook.set(self, data) end function __meta.__index:clear() __hook.clear(self) end function __meta.__index:run() __hook.run(self) end
function meta.__index(self, pos, data) -- clamp position if pos < 1 then pos = 1 end if pos > 9 then pos = 9 end
-- create if it does not exist if not self.level[pos] then table.insert(self.level, pos, __hook.new()) end
return self.level[pos] end
function meta.__newindex(self, pos, data) self[pos]:set(data) end
|