local Square = {}
function Square.new(side)
return setmetatable({side = side}, Square)
end
-- Reading a missing field calls __index
function Square.__index(self, key)
if key == "area" then
return self.side * self.side
end
return Square[key]
end
-- Writing a missing field calls __newindex
function Square.__newindex(self, key, value)
if key == "area" then
self.side = math.sqrt(value)
else
rawset(self, key, value)
end
end
local square = Square.new(2)
-- square.area = 4
print("square.area = " .. square.area)
square.area = 9
-- square.side = 3.0
print("square.side = " .. square.side)