code: def debug_contents(self, indent=1, file=sys.stdout, _ids=None):
          
          klasses = list(self.__class__.__mro__)
          klasses.reverse()
  
          # print special attributes "bottom up"
          previous_attrs = ()
          for c in klasses:
              attrs = getattr(c, '_debug_contents', ())
  
              # if we have seen this list already, move to the next class
              if attrs is previous_attrs:
                  continue
  
              for attr in attrs:
                  file.write("%s%s = %s\n" % ("    " * indent, attr, getattr(self, attr)))
              previous_attrs = attrs
  
          # build a list of property identifiers "bottom up"
          property_names = []
          properties_seen = set()
          for c in klasses:
              for prop in getattr(c, 'properties', []):
                  if prop.identifier not in properties_seen:
                      property_names.append(prop.identifier)
                      properties_seen.add(prop.identifier)
  
          # print out the values
          for property_name in property_names:
              property_value = self._values.get(property_name, None)
  
              # printing out property values that are None is tedious
              if property_value is None:
                  continue
  
              if hasattr(property_value, "debug_contents"):
                  file.write("%s%s\n" % ("    " * indent, property_name))
                  property_value.debug_contents(indent+1, file, _ids)
              else:
                  file.write("%s%s = %r\n" % ("    " * indent, property_name, property_value))
docs: Print out interesting things about the object.