local mt = {}
local clone
mt[mt] = setmetatable({}, {__mode = "k"})
mt.__mode = "kv"
mt.__index = function(t, k)
local v = rawget(mt[mt][t], k)
if type(v) == "table" then
v = clone(v)
end
rawset(t, k, v)
return v
end
clone = function(t)
local ret = {}
mt[mt][ret] = t
return setmetatable(ret, mt)
end
table.clone = clone