Previously, this was done recursively, per object, and the nonIO version was cached. This reverses both those approaches.