return { extend = function (self, subtype) return setmetatable(subtype or {}, { __index = self, __call = function (self, ...) local instance = setmetatable({}, { __index = self }) return instance, instance:constructor(...) end }) end, constructor = function () end, }