cached_property would clean this up.