mirror of
https://github.com/kepler155c/opus
synced 2024-11-16 05:34:49 +00:00
50 lines
1.1 KiB
Lua
50 lines
1.1 KiB
Lua
-- From http://lua-users.org/wiki/SimpleLuaClasses
|
|
-- (with some modifications)
|
|
|
|
-- class.lua
|
|
-- Compatible with Lua 5.1 (not 5.0).
|
|
return function(base)
|
|
local c = { } -- a new class instance
|
|
if type(base) == 'table' then
|
|
-- our new class is a shallow copy of the base class!
|
|
if base._preload then
|
|
base = base._preload(base)
|
|
end
|
|
for i,v in pairs(base) do
|
|
c[i] = v
|
|
end
|
|
c._base = base
|
|
end
|
|
-- the class will be the metatable for all its objects,
|
|
-- and they will look up their methods in it.
|
|
c.__index = c
|
|
|
|
-- expose a constructor which can be called by <classname>(<args>)
|
|
setmetatable(c, {
|
|
__call = function(class_tbl, ...)
|
|
local obj = { }
|
|
setmetatable(obj,c)
|
|
if class_tbl.init then
|
|
class_tbl.init(obj, ...)
|
|
else
|
|
-- make sure that any stuff from the base class is initialized!
|
|
if base and base.init then
|
|
base.init(obj, ...)
|
|
end
|
|
end
|
|
return obj
|
|
end
|
|
})
|
|
|
|
c.is_a =
|
|
function(self, klass)
|
|
local m = getmetatable(self)
|
|
while m do
|
|
if m == klass then return true end
|
|
m = m._base
|
|
end
|
|
return false
|
|
end
|
|
return c
|
|
end
|