Animal = { name = "Animalia" } function Animal:eat() print ("(Animal) " .. self.name .. " is eating") end function Animal:new(o) o = o or {} setmetatable(o, self) self.__index = self return o end Mammal = Animal:new { name = "Mammalia" } function Mammal:eat() print ("(Mammal) " .. self.name .. " is eating") end function Mammal:suck() print ("(Mammal) " .. self.name .. " is sucking milk") end Dog = Mammal:new { name = "Canis lupus familiaris" } function Dog:eat() print ("(Dog) " .. self.name .. " is eating") end function Dog:bark() print ("(Dog) " .. self.name .. " is barking") end -- Working with the original object prototypes: print("Working with the original object prototypes"); Animal:eat(); Mammal:eat(); Dog:eat(); Mammal:suck(); Dog:suck(); Dog:bark(); -- Working with object instances: print("Working with object instances"); a = Animal:new {} m = Mammal:new {} d0 = Dog:new {} d1 = Dog:new {name = "Tigrinho"} a:eat(); m:eat(); d0:eat(); d1:eat(); m:suck(); d0:suck(); d0:bark(); d1:suck(); d1:bark();