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
