Who are you hiding your table from? Yourself? Is that the Minecraft hidden base in singleplayer syndrome creeping into Roblox code? 
Just… don’t. You can do it via recursion or a loop, but why would you want to?
local Player = {Apple = true}
Player.__index = Player
local Admin = setmetatable({__index = Player},Player)
local SuperAdmin = setmetatable({__index = Admin},Admin)
local function create_class_super_admin():()
local self = {}
return setmetatable(self,SuperAdmin)
end
local class = create_class_super_admin()
print(class.Apple)
See? class.Apple behind the scenes does ~4 lookups on the VM level. That’s essentially x4 slower than direct access.
You really don’t want that; you want full access.
Hence, paradigms like ECS are superior. Look at Entity Component System implementations in Roblox:
local Players = game:GetService("Players")
local Plr_Health_Component:{[Player]:number} = {}
Players.PlayerAdded:Connect(function(Plr):()
Plr_Health_Component[Plr] = 100
Plr.CharacterAdded:Connect(function():()
Plr_Health_Component[Plr] = 100
end)
Plr.CharacterRemoving:Connect(function():()
Plr_Health_Component[Plr] = 0
end)
end)
Players.PlayerRemoving:Connect(function(Plr):()
Plr_Health_Component[Plr] = nil
end)
Back to your “full path” thing… dead simple:
local class = create_class_super_admin()
print(getmetatable(class))
The real solution? Build your system without metatables. No lag, no hidden overhead, pure logic you can actually see.
Just don’t be scared of yourself - stop hiding logic from yourself.