2022-04-27 02:40:22 +02:00
|
|
|
---Member lookup helper function
|
|
|
|
---@param key string
|
|
|
|
---@param bases any
|
|
|
|
---@return any
|
2022-04-11 18:47:26 +02:00
|
|
|
local function search(key, bases)
|
|
|
|
for _, base in ipairs(bases) do
|
|
|
|
local v = base[key] -- try `i'-th superclass
|
|
|
|
if v then return v end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-04-27 02:40:22 +02:00
|
|
|
---Create polimorphic class
|
2022-04-14 23:14:13 +02:00
|
|
|
---@generic BaseT, T
|
|
|
|
---@param cls T # class metatable
|
2022-05-06 01:02:30 +02:00
|
|
|
---@param params? table # initial parameters
|
2022-04-27 00:06:42 +02:00
|
|
|
---@param ... BaseT # base class metatables (if any)
|
|
|
|
---@return T # class instance
|
2022-05-06 01:02:30 +02:00
|
|
|
function CreateInstance(cls, params, ...)
|
|
|
|
params = params or {}
|
2022-04-11 18:47:26 +02:00
|
|
|
local nargs = select("#", ...)
|
|
|
|
local vargs = { select(1, ...) }
|
2022-04-03 19:43:50 +02:00
|
|
|
cls.__index = cls
|
2022-04-27 00:06:42 +02:00
|
|
|
if nargs == 1 then
|
2022-04-27 02:40:22 +02:00
|
|
|
-- single inheritance
|
2022-04-27 00:06:42 +02:00
|
|
|
local base = vargs[1]
|
|
|
|
setmetatable(cls, {__index = base})
|
2022-05-06 01:02:30 +02:00
|
|
|
params = base.new(params)
|
2022-04-27 00:06:42 +02:00
|
|
|
elseif nargs > 1 then
|
2022-04-27 02:40:22 +02:00
|
|
|
-- multiple inheritance (note: slow(er) member lookup)
|
2022-04-11 18:47:26 +02:00
|
|
|
setmetatable(cls, {__index = function(t, k) return search(k, vargs) end})
|
2022-04-14 23:14:13 +02:00
|
|
|
for _, base in ipairs(vargs) do
|
2022-05-06 01:02:30 +02:00
|
|
|
params = base.new(params)
|
2022-04-11 18:47:26 +02:00
|
|
|
end
|
|
|
|
end
|
2022-05-06 01:02:30 +02:00
|
|
|
setmetatable(params, cls)
|
|
|
|
return params
|
2022-04-11 18:47:26 +02:00
|
|
|
end
|