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.
67 lines
1.8 KiB
67 lines
1.8 KiB
local _, ns = ...
|
|
|
|
ns.Class = function (name, parent)
|
|
parent = parent or {}
|
|
local Class = { getters = {}, setters = {} }
|
|
|
|
setmetatable(Class, {
|
|
__call = function (self, instance)
|
|
instance = instance or {}
|
|
instance.__class = Class;
|
|
|
|
local address = tostring(instance):gsub("table: ", "", 1)
|
|
|
|
setmetatable(instance, {
|
|
__tostring = function ()
|
|
return '<'..name..' object at '..address..'>'
|
|
end,
|
|
|
|
__index = function (self, index)
|
|
local getter = Class.getters[index]
|
|
if getter then return getter(self) end
|
|
return Class[index]
|
|
end,
|
|
|
|
__newindex = function (self, index, value)
|
|
local setter = Class.setters[index]
|
|
if setter then
|
|
setter(self, value)
|
|
else
|
|
rawset(self, index, value)
|
|
end
|
|
end
|
|
})
|
|
|
|
local init = Class.init
|
|
if init then init(instance) end
|
|
|
|
return instance
|
|
end,
|
|
|
|
__tostring = function ()
|
|
return '<class "'..name..'">'
|
|
end,
|
|
|
|
__index = parent
|
|
})
|
|
|
|
if parent then
|
|
setmetatable(Class.getters, { __index = parent.getters })
|
|
setmetatable(Class.setters, { __index = parent.setters })
|
|
Class.__parent = parent
|
|
else
|
|
-- Add default init() method for base class
|
|
Class.init = function (self) end
|
|
end
|
|
|
|
return Class
|
|
end
|
|
|
|
ns.isinstance = function (instance, class)
|
|
local function compare (c1, c2)
|
|
if c2 == nil then return false end
|
|
if c1 == c2 then return true end
|
|
return compare(c1, c2.__parent)
|
|
end
|
|
return compare(class, instance.__class)
|
|
end
|
|
|