 /// Observes a managed object and updates a ```CoreDataDecodable```.
 public final class ManagedObjectObserver<Decodable: CoreDataDecodable> {
     
-    public var decodable: Decodable?
+    // MARK: - Properties
+    
+    public private(set) var decodable: Decodable?
     
     public let managedObject: NSManagedObject
     
     public let context: NSManagedObjectContext
     
+    public var event = ManagedObjectObserverEvent<Decodable>()
+    
+    // MARK: - Private Properties
+    
     private let privateObserver: PrivateManagedObjectObserver
+    
+    // MARK: - Initialization
     
     public init(managedObject: NSManagedObject, context: NSManagedObjectContext) {
         
         self.managedObject = managedObject
         self.context = context
         
+        self.decodable = Decodable.init(managedObject: managedObject)
+        
         self.privateObserver = PrivateManagedObjectObserver(managedObject: managedObject, context: context)
     }
+}
+
+// MARK: - Supporting Types
+
+public struct ManagedObjectObserverEvent<Decodable: CoreDataDecodable> {
+    
+    public var updated: Decodable -> () = { _ in }
+    
+    public var deleted: () -> () = { _ in }
 }
 
 // MARK: - Private

        
        self.managedObject = managedObject
        self.context = context
        
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "managedObjectContextObjectsDidChange:", name: NSManagedObjectContextObjectsDidChangeNotification, object: context)
    }

    
    func observer(observer: PrivateManagedObjectObserver, managedObjectUpdated managedObject: NSManagedObject)
    
    func observer(observer: PrivateManagedObjectObserver, managedObjectDeleted managedObject: NSManagedObject)
}

extension ManagedObjectObserver: PrivateManagedObjectObserverDelegate {
    
    private func observer(observer: PrivateManagedObjectObserver, managedObjectUpdated managedObject: NSManagedObject) {
        
        let decodable = Decodable.init(managedObject: managedObject)
        
        self.decodable = decodable
        
        self.event.updated(decodable)
    }
    
    private func observer(observer: PrivateManagedObjectObserver, managedObjectDeleted managedObject: NSManagedObject) {
        
        self.decodable = nil
        
        self.event.deleted()
    }
}
