         return self
     }
     
-//    func snap(_ dict:Properties) -> Kinieta {
-//        
-//        let m = Transformation(self.view, for: dict)
-//        
-//        self.view.transform = m.cgAffineTransform
-//        
-//        return self
-//    }
-//    
-//    func wait(_ time:TimeInterval) -> Kinieta {
-//        
-//        
-//        return self
-//    }
+    func snap(_ dict: [String:Any]) -> Kinieta {
+        
+        
+        return self
+    }
+    
+    func wait(_ time:TimeInterval) -> Kinieta {
+        
+        
+        return self
+    }
     
     
-//    func group() -> Kinieta {
-//        
-//    }
-}
-
-extension UIView {
-    
-    public var kinieta: Kinieta {
-        
-        guard let instance = objc_getAssociatedObject(self, &Kinieta.associatedKey) as? Kinieta else {
-            let instance = Kinieta(self)
-            objc_setAssociatedObject(self, &Kinieta.associatedKey, instance, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
-            return instance
-        }
-        
-        return instance
+    func group() -> Kinieta {
         
     }
 }
+
+extension UIView: Kinieta {
+    
+    func move(_ dict: [String:Any]) -> Kinieta {
+        return KinietaInstance(self).move(dict)
+    }
+    func move(_ dict: [String:Any], _ time: TimeInterval) -> Kinieta {
+        return KinietaInstance(self).move(dict, time)
+    }
+    func snap(_ dict: [String:Any]) -> Kinieta {
+        return KinietaInstance(self).snap(dict)
+    }
+    
+    
+}

    
    // MARK: API
    
    func move(_ dict: [String:Any], time: TimeInterval? = 0.5, ease: Easing? = .none) -> Kinieta {
        
        let m = Transformation(self.view, for: dict)
        


import UIKit

protocol Kinieta {
    func move(_ dict: [String:Any]) -> Kinieta
    func move(_ dict: [String:Any], _ time: TimeInterval) -> Kinieta
    func snap(_ dict: [String:Any]) -> Kinieta
}

class KinietaEngine {
    
    static let shared = KinietaEngine()
    
    private var displayLink: CADisplayLink?
    
    
    private var instances: [KinietaInstance] = []
    
    init() {
        
    }
    
    func add(_ instance: KinietaInstance) {
        
        instances.append(instance)
        
        if displayLink == nil {
            displayLink = CADisplayLink(target: self, selector: #selector(KinietaEngine.update(_:)))
            displayLink?.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
        }
    }
    
    @objc func update(_ displayLink: CADisplayLink) {
        
    }
}

class KinietaInstance: Kinieta {
    
    static var associatedKey = "KinietaAssociatedKey"
    enum State {
