old_contents: import json
  
  from sqlalchemy.ext.mutable import Mutable
  from sqlalchemy.types import TypeDecorator, TEXT
  
  
  class JSONEncodedDict(TypeDecorator):
      "Represents an immutable structure as a json-encoded string."
  
      impl = TEXT
  
      def process_bind_param(self, value, dialect):
          if value is not None:
              value = json.dumps(value)
          return value
  
      def process_result_value(self, value, dialect):
          if value is not None:
              value = json.loads(value)
          return value
  
  
  class MutationDict(Mutable, dict):
      @classmethod
      def coerce(cls, key, value):
          "Convert plain dictionaries to MutationDict."
  
          if not isinstance(value, MutationDict):
              if isinstance(value, dict):
                  return MutationDict(value)
  
              # this call will raise ValueError
              return Mutable.coerce(key, value)
          else:
              return value
  
      def __setitem__(self, key, value):
          "Detect dictionary set events and emit change events."
  
          dict.__setitem__(self, key, value)
          self.changed()
  
      def __delitem__(self, key):
          "Detect dictionary del events and emit change events."
  
          dict.__delitem__(self, key)
          self.changed()
  
new_contents: import json
  
  from sqlalchemy.ext.mutable import Mutable
  from sqlalchemy.types import TypeDecorator, TEXT
  
  
  class JSONEncodedDict(TypeDecorator):
      "Represents an immutable structure as a json-encoded string."
  
      impl = TEXT
  
      def process_bind_param(self, value, dialect):
          if value is not None:
              value = json.dumps(value)
          return value
  
      def process_result_value(self, value, dialect):
          if value is not None:
              value = json.loads(value)
          return value
  
  
  class MutationDict(Mutable, dict):
      @classmethod
      def coerce(cls, key, value):
          "Convert plain dictionaries to MutationDict."
  
          if not isinstance(value, MutationDict):
              if isinstance(value, dict):
                  return MutationDict(value)
  
              # this call will raise ValueError
              return Mutable.coerce(key, value)
          else:
              return value
  
      def __setitem__(self, key, value):
          "Detect dictionary set events and emit change events."
  
          dict.__setitem__(self, key, value)
          self.changed()
  
      def __delitem__(self, key):
          "Detect dictionary del events and emit change events."
  
          dict.__delitem__(self, key)
          self.changed()
  
  
  class MutableList(Mutable, list):
      @classmethod
      def coerce(cls, key, value):
          if not isinstance(value, MutableList):
              if isinstance(value, list):
                  return MutableList(value)
              value = Mutable.coerce(key, value)
  
          return value
  
      def __setitem__(self, key, value):
          old_value = list.__getitem__(self, key)
          for obj, key in self._parents.items():
              old_value._parents.pop(obj, None)
  
          list.__setitem__(self, key, value)
          for obj, key in self._parents.items():
              value._parents[obj] = key
  
          self.changed()
  
      def append(self, item):
          list.append(self, item)
          self.changed()
  
      def extend(self, iterable):
          list.extend(self, iterable)
          self.changed()
  
      def insert(self, index, item):
          list.insert(self, index, item)
          self.changed()
  
      def remove(self, value):
          list.remove(self, value)
          self.changed()
  
      def reverse(self):
          list.reverse(self)
          self.changed()
  
      def pop(self, index=-1):
          item = list.pop(self, index)
          self.changed()
          return item
  
      def sort(self, cmp=None, key=None, reverse=False):
          list.sort(self, cmp, key, reverse)
          self.changed()
  
      def __getstate__(self):
          return list(self)
  
      def __setstate__(self, state):
          self[:] = state
  
subject: Add MutableList (required for SQLAlchemy >= 0.8)