-- Homework 27, challenge -- solution.

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 Cat = setmetatable({}, { __index = Animal })
Cat.__index = Cat

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

function Cat:meow()
    print(self.name .. ": Meow.")
end

local rex = Dog.new("Rex")
local whiskers = Cat.new("Whiskers")

rex:describe()
whiskers:describe()

rex:bark()
whiskers:meow()
