I am leaning towards changing all the userdata types (request_rec, server_rec, conn_rec, apr_table_t) in mod_wombat to have anonymous metatables rather than the current setup where they share a metatable.

The benefit of going to a per-instance metatable is that we can curry the relevant struct onto the relevant CFunctions when we push the metatable. This would allow much saner dispatch of functions, indxeing of properties etc. The current scheme is kind of broken in that you can only have one of each type at a time.

The drawback is that we lose the ~"type safety" of being able to use luaL_checkuserdata(...) to pop userdata with a specific metatable out of the stack.

This would do arbitrary lookups on userdata as though it were a lua table:

r.headers_in, r.status, etc.

It may be possible, depending on the exact semantics, to use __index and __newindex overloading with the OO syntax:

r:headers_in
r:status

to maintain the current setup of a single metatable, but I am not sure exactly how this behaves. Hopefully I will have a chance to play with it tomorrow and see. If it passes the userdata instances to __index then we can dispatch in __index and be in pretty good shape. I have a funny feeling it is going to not work though as it really wants a function invocation for the : syntax.

-Brian

Reply via email to