-- Chapter 27 example: Animal -> Dog inheritance.

local Animal = {}
Animal.__index = Animal

function Animal.new(name)
    local self = setmetatable({}, Animal)
    self.name = name
    return self
end

function Animal:describe()
    print("I am " .. self.name .. ".")
end

local Dog = setmetatable({}, { __index = Animal })
Dog.__index = Dog

function Dog.new(name)
    local self = Animal.new(name)
    return setmetatable(self, Dog)
end

function Dog:bark()
    print(self.name .. ": Woof!")
end

local rex = Dog.new("Rex")
rex:describe()    -- I am Rex.
rex:bark()        -- Rex: Woof!
