I'm confused. Why are you trying so hard to make caching nil values weird? :)

Right now, if my block returns nil, you are not caching that (and the next fetch will be a cache miss and run the block again. Might have been expensive to compute that nil).

Why don't you just use the idea that "store hash has key" is equivalent of "a value for that key has been cached". The actual value (nil or not) should be completely irrelevant.