docs: def _property_names(self):
          """
              Gather up properties and cached_properties which may be methods
              that were decorated. Need to inspect class versions b/c doing
              getattr on them could cause unwanted side effects.
          """
          property_names = []
  
          for name in dir(self):
              try:
                  attr = getattr(type(self), name)
  
                  if isinstance(attr, property) or isinstance(attr, cached_property):
                      property_names.append(name)
  
              except AttributeError:
                  pass
  
          return property_names