     typealias ValueContainerType = [AnyHashable: Any]
 
     internal class ChangeData : NSObject, NSCoding  {
-        required convenience init?(coder aDecoder: NSCoder) {
-            self.init()
-        }
-        func encode(with aCoder: NSCoder) {
-        }
+        required override init() {}
+        required init?(coder aDecoder: NSCoder) {}
+        func encode(with aCoder: NSCoder) {}
     }
     /**
         NOTE: the attributes in this class are all public because

        override func encode(with aCoder: NSCoder) {
            aCoder.encode(attributesAndValues)
            aCoder.encode(updatedAttributes)
        }

    }

    internal class DeleteData : ChangeData   {
        required convenience init?(coder aDecoder: NSCoder) {
            self.init()
        }
        override func encode(with aCoder: NSCoder) {}
    }
}

    internal class InsertData : ChangeData {
        var attributesAndValues: ValueContainerType?

        required override init() {
            super.init()
        }

        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            
            attributesAndValues = aDecoder.decodeObject() as? ValueContainerType
        }
        override func encode(with aCoder: NSCoder) {
            aCoder.encode(attributesAndValues)
            super.encode(with: aCoder)
        }
    }

    internal class UpdateData : ChangeData  {
        var attributesAndValues: ValueContainerType?
        var updatedAttributes:   [String]?

        required override init() {
            super.init()
        }

        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            
            attributesAndValues = aDecoder.decodeObject() as? ValueContainerType
            updatedAttributes   = aDecoder.decodeObject() as? [String]
