use cached_property