Returns property that calls given getter on the first access
    and reuses result afterwards.

    Class instances should be hashable and weak referenceable.

def property_(getter: Map[Domain, Range]) -> property:
    """
    Returns property that calls given getter on the first access
    and reuses result afterwards.

    Class instances should be hashable and weak referenceable.
    """
    return property(map_(WeakKeyDictionary())(getter))