---Declare table as a base class ---@param cls table class table ---@param o table class instance table ---@return table o base class instance table function Base(cls, o) cls.__index = cls o = o or {} setmetatable(o, cls) return o end 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 a derived class ---@param cls table class table ---@param o table class instance table ---@param ... table[] base class tables ---@return table o derived class instance table function Inherit(cls, o, ...) local nargs = select("#", ...) local vargs = { select(1, ...) } cls.__index = cls if nargs > 1 then setmetatable(cls, {__index = function(t, k) return search(k, vargs) end}) for _, value in ipairs(vargs) do o = value:new(o) end else local base = assert(vargs[1], "You must at least specify one class to inherit from.") setmetatable(cls, {__index = base}) o = base:new(o) end setmetatable(o, cls) return o end