'Collect the names of properties on this class.
This method *optionally* traverses the class hierarchy and includes
properties defined on any parent classes.
Args:
with_bases (bool, optional) :
Whether to include properties defined on parent classes in
the results. (default: True)
Returns:
set[str] : property names'

@classmethod
def properties(cls, with_bases=True):

    if with_bases:
        return accumulate_from_superclasses(cls, '__properties__')
    else:
        return set(cls.__properties__)
