OpenSDE Framework (without history before r20070)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

155 lines
3.8 KiB

-- --- 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