use weakref cache