Simpler factory getter, no need to reimplement cache on top of cached_property