this is by making metatable names fully qualified names
that contain the entire "path" for reaching them and not
just the name of the object they point to.
with the fix, the code would either create a new metatable,
as in this case:
local o1 = Request.Object
-- new metatable is created to represent the Object in Request.Object
local o2 = Request.CopyFrom.Object
-- new metatable (with different upvalues) is created to represent Request.CopyFrom.Object
print(o1.Name)
print(o2.Name)
or, will reuse an existing metatable, as in this case:
local o1 = Request.Object
-- new metatable is created to represent the Object in Request.Object
local o2 = Request.Object
-- reuse the same metatable
print(o1.Name)
print(o2.Name)