weakref-based object cache