local Animal = {} Animal.__index = Animal function Animal.new(name) return setmetatable({ name = name }, Animal) end function Animal:move() print(self.name .. " moves.") end local function child() local C = setmetatable({}, { __index = Animal }) C.__index = C function C.new(name) return setmetatable(Animal.new(name), C) end return C end local Bird = child() function Bird:move() print(self.name .. " flies.") end local Fish = child() function Fish:move() print(self.name .. " swims.") end local creatures = { Bird.new("Robin"), Fish.new("Nemo") } for _, c in ipairs(creatures) do c:move() end