         object.removeObserver(self, forKeyPath: keyPath, context: &token)
     }
     
-    public override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
+    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
         if context == &token {
             if change != nil {
-                self.put(change!)
+                callback?(change!)
             }
         } else {
             super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
         }
     }
+}
+
+public class Observer<T> {
     
-    private func put(change: [String : AnyObject]) {
+    public let sink = Sink<T>()
+    
+    private let base: ObserverBase
+    
+    private init(object: NSObject, keyPath: String, options: NSKeyValueObservingOptions) {
+        self.base = ObserverBase(object: object, keyPath: keyPath, options: options)
+        self.base.callback = { [weak self] in self?.callback($0) }
+    }
+    
+    private func callback(change: [String : AnyObject]) {
         
     }
 }

                super.init(object: object, keyPath: keyPath, options: .Prior)
            }
            
            override func put(change: [String : AnyObject]) {
                if let old = change[NSKeyValueChangeOldKey] {
                    self.sink.put(old)
                }

                super.init(object: object, keyPath: keyPath, options: [.New, .Old, .Initial, .Prior])
            }
            
            override func callback(change: [String : AnyObject]) {
                self.sink.put(change)
            }
        }
