function setm(tbl) local meta = { __newindex = function(t, k, v); if type(v) == 'table' then tbl[k] = setm(v); end; end; __index = function(t, k) if k == 'meta' then return function(self) if self ~= tbl then return error('Attempted to call a method as a function', 0); end; return getmetatable(tbl) or meta; end; end; end; }; return setmetatable(tbl, meta); end; local env = setmetatable({ }, { __index = function(t, k) if type(k) == 'table' then return k, k:meta(); end; end; __newindex = function(t, k, v) if type(v) == 'table' then getfenv(0)[k] = setm(v); end; end; }); setfenv(1, env); a = { b = { }; }; print(a, a.b);