Caching using weak references