 	}
 }
 
-func +<T>(lhs: T, rhs: T) -> T where T: Animatable {
-	return T.composed(from: zip(lhs.components, rhs.components).flatMap { $0.0 + $0.1 })
-}
-
-func -<T>(lhs: T, rhs: T) -> T where T: Animatable {
-	return T.composed(from: zip(lhs.components, rhs.components).flatMap { $0.0 - $0.1 })
-}
-
-public struct PhysicsState<T> where T: Animatable {
-
-	public var value: T
-
-	public var velocity: T
-}
-
+/// Your fast and friendly physics based animator.
 public final class YapAnimator<T>: YapAnimatorCommonInterface where T: Animatable {
 
 	// Animation Variables
 
+	/// The target value of the animator
 	public var toValue: T {
 		didSet {
 			if oldValue.components != toValue.components {
+				targetedCompletion(self, false)
+				targetedCompletion = { _ in }
+				targetedAction = { _ in }
 				setNeedsUpdate()
 			}
 		}
 	}
 
+	/// Set the target value of the animator
+	///
+	/// - Parameter to: The target value of the animator
+	/// - Parameter action: This closure gets called every frame of the animation just like the `action` that was defined in the animator's constructor but with a very important difference: **It is only called and retained as long as this function is not called again or the toValue does not change.**
+	/// - Parameter animator: The associated `YapAnimator`
+	/// - Parameter completion: This closure gets called when the animator comes to rest or is stopped otherwise. The `Bool` value passed into this closure will be `true` if the animator comes to rest at the `toValue` or `false` if the animator is stopped for any other reason. This is just like the `completion` in the constructor but with a very important difference: **It is only called and retained as long as this function is not called again or the toValue does not change.**
+	/// - Parameter animator: The associated `YapAnimator`
+	/// - Parameter finished: `true` if the animator comes to rest at the `toValue` or `false` if the animator is stopped for any other reason.
+	func animate(to: T, action: @escaping (_ animator: YapAnimator) -> Void = { _ in }, completion: @escaping (_ animator: YapAnimator, _ finished: Bool) -> Void = { _ in }) {
+		// setting the toValue clears any extant targetedAction
+		toValue = to
+		targetedAction = action
+		// will cancel any in-flight completion
+		targetedCompletion(self, false)
+		targetedCompletion = completion
+	}
+
+	/// A value defining the bounciness of the animator. A value of `0` represents a critically dampened spring — one that moves as quickly to the target value without overshooting. A value of `1` represents an aesthetically pleasing bounce. This value can be set to values under or over this range.
 	public var bounciness = 0.0 {
 		didSet {
 			if oldValue != bounciness {


import QuartzCore

public enum YapAnimatorState {
	/// The `YapAnimator` is at rest
	case possible
	/// The `YapAnimator` has just requested that it be updated.


	fileprivate var action: (YapAnimator) -> Void

	fileprivate var completion: (YapAnimator, _ finished: Bool) -> Void

	fileprivate var targetedAction: (YapAnimator) -> Void = { _ in }

	fileprivate var targetedCompletion: (YapAnimator, _ finished: Bool) -> Void = { _ in }

	fileprivate weak var observer: YapAnimatorObserver?

