Obviously, indexing a table will only get you one value.  Less
obviously, that's true even when there's an __index metamethod that
returns more than one result:
  mt = { __index = function() return 1, 2, 3 end }
  t = {}
  setmetatable( t, mt )
  a, b, c = t.test
  print( a, b, c )
gives "1   nil  nil".
We'd like to get multiple values("1  2  3").  Is that easy to do?
I've been poking at the source, and found some likely-looking functions.
Replacing the last parameter of the call to luaD_call() in callTMres()
with LUA_MULTRET is an obvious start.  Then I'll have to persuade
setobjs2s() to copy all values to the right place.  And then... I get
lost.  How does the VM know that luaV_gettable() only returns one value?
The rest of the stack is still full of callTMres()'s workings.
Why do we want multiple values?  We decided that the nicest interface to
our ugly C++ code is through properties (yes, there's an ex-Delphi
programmer on the team):
object.position = otherObject.position
ends up calling C++ functions to get and set the position.  Then someone
decided that the state of a controller button (we do console games) was
best expressed with two values: state (it has just been pressed, it is
still being pressed, it has just been released, etc) and pressure:
state, pressure = controller.button
These are the multiple values we want to return from __index.