def METHOD_NAME(self):
    """
    Return True if the object has changes on any of its column properties
    or any relationship attributes named in self.versioned_relationships,
    or has been manually marked as dirty (the special 'dirty' instance
    attribute is set to True).
    """
    obj_state = inspect(self)
    versioned_attribute_names = list(self.versioned_relationships)
    for mapper in obj_state.mapper.iterate_to_root():
        for attr in mapper.column_attrs:
            versioned_attribute_names.append(attr.key)
    for attr_name in versioned_attribute_names:
        if getattr(obj_state.attrs, attr_name).history.has_changes():
            return True
    return False