docs: def cached_getter(func):
    """Decorate a property by executing it at instatiation time and cache the
    result on the instance object."""
    @wraps(func)
    def wrapper(self):
      attribute = f'_{func.__name__}'
      value = getattr(self, attribute, None)
      if value is None:
        value = func(self)
        setattr(self, attribute, value)
      return value
    return wrapper