One issue I noted in further testing is when you try and set a new metatable to a latebound table you wipe out the mechanism for binding functions
I used the __metatable method to block this but I really don't want to make that permenant
so I added removal of the metatable when you bind all functions
I also added the __call metamethod to make it a bit more intuitive to bind a function
for instance.. the math table
f_add = math("add") -- binds add function
local t = {dummy = "dummy"}
setmetatable(math, t) -- ERROR 'cannot change a protected metatable'
math(nil) -- binds all math functions
local oldt = getmetatable(math) -- oldt == nil
setmetatable(math, t) -- success