Ah, I thought the weak table was to store the weak pointers for access from the object for bookkeeping - this way around it actually makes more sense.
One thing I'm still struggling with is the fact that everybody can just go and retain an object - what if you want to force deletion of an object? Like, for example, a SceneNode that should be removed from the scene? As far as I understand it, someone somewhere could always be storing a reference to it via a Retain() call, and would not be notified of the deletion because he's not using a weak pointer, so he's left with a dangling pointer. I wonder if there's a way to solve that, besides forcing everyone to use the weak pointer type.