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 ---Declare table as polimorphic class ---@generic BaseT, T ---@param cls T # class metatable ---@param o? table # initial parameters ---@param ... BaseT # base class metatables (if any) ---@return T # class instance function CreateClass(cls, o, ...) o = o or {} local nargs = select("#", ...) local vargs = { select(1, ...) } cls.__index = cls if nargs == 1 then local base = vargs[1] setmetatable(cls, {__index = base}) o = base:new(o) elseif nargs > 1 then setmetatable(cls, {__index = function(t, k) return search(k, vargs) end}) for _, base in ipairs(vargs) do o = base:new(o) end end setmetatable(o, cls) return o end