83 lines
1.6 KiB
Lua
83 lines
1.6 KiB
Lua
---@class core.object
|
|
---@field super core.object
|
|
local Object = {}
|
|
Object.__index = Object
|
|
|
|
---Can be overrided by child objects to implement a constructor.
|
|
function Object:new() end
|
|
|
|
---@return core.object
|
|
function Object:extend()
|
|
local cls = {}
|
|
for k, v in pairs(self) do
|
|
if k:find("__") == 1 then
|
|
cls[k] = v
|
|
end
|
|
end
|
|
cls.__index = cls
|
|
cls.super = self
|
|
setmetatable(cls, self)
|
|
return cls
|
|
end
|
|
|
|
---Check if the object is strictly of the given type.
|
|
---@param T any
|
|
---@return boolean
|
|
function Object:is(T)
|
|
return getmetatable(self) == T
|
|
end
|
|
|
|
---Check if the parameter is strictly of the object type.
|
|
---@param T any
|
|
---@return boolean
|
|
function Object:is_class_of(T)
|
|
return getmetatable(T) == self
|
|
end
|
|
|
|
---Check if the object inherits from the given type.
|
|
---@param T any
|
|
---@return boolean
|
|
function Object:extends(T)
|
|
local mt = getmetatable(self)
|
|
while mt do
|
|
if mt == T then
|
|
return true
|
|
end
|
|
mt = getmetatable(mt)
|
|
end
|
|
return false
|
|
end
|
|
|
|
---Check if the parameter inherits from the object.
|
|
---@param T any
|
|
---@return boolean
|
|
function Object:is_extended_by(T)
|
|
local mt = getmetatable(T)
|
|
while mt do
|
|
if mt == self then
|
|
return true
|
|
end
|
|
local _mt = getmetatable(T)
|
|
if mt == _mt then break end
|
|
mt = _mt
|
|
end
|
|
return false
|
|
end
|
|
|
|
---Metamethod to get a string representation of an object.
|
|
---@return string
|
|
function Object:__tostring()
|
|
return "Object"
|
|
end
|
|
|
|
---Methamethod to allow using the object call as a constructor.
|
|
---@return core.object
|
|
function Object:__call(...)
|
|
local obj = setmetatable({}, self)
|
|
obj:new(...)
|
|
return obj
|
|
end
|
|
|
|
|
|
return Object
|