---Member lookup helper function ---@param key string ---@param bases any ---@return any 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 ---Create polimorphic class ---@generic BaseT, T ---@param cls T # class metatable ---@param params? table # initial parameters ---@param ... BaseT # base class metatables (if any) ---@return T # class instance function CreateInstance(cls, params, ...) params = params or {} local nargs = select("#", ...) local vargs = { select(1, ...) } cls.__index = cls if nargs == 1 then -- single inheritance local base = vargs[1] setmetatable(cls, {__index = base}) params = base.new(params) elseif nargs > 1 then -- multiple inheritance (note: slow(er) member lookup) setmetatable(cls, {__index = function(t, k) return search(k, vargs) end}) for _, base in ipairs(vargs) do params = base.new(params) end end --DetailedLog(debug.traceback(), game.LOGGER_DEBUG) -- here for debug purposes setmetatable(params, cls) return params end