         case .animation(let duration, let delay, let options, let animations):
             
             UIView.animate(withDuration: duration, delay: delay, options: options, animations: animations) { success in
-                self.perform(completion)
+                self.perform(completion: completion)
             }
             
+        case .spring(let duration, let delay, let damping, let velocity, let options, let animations):
+            
+            UIView.animate(withDuration: duration, delay: delay, usingSpringWithDamping: damping, initialSpringVelocity: velocity, options: options, animations: animations) { success in
+                self.perform(completion: completion)
+            }
+            
         case .wait(let timeout, let waitBlock):
             
             resumeBlock = {
-                self.perform(completion)
+                self.perform(completion: completion)
                 self.resumeBlock = nil
             }
             // This passes a closure to the waitBlock which is the resume funtion that the developer must call in the waitBlock.

     
     - warning: Not calling finish or perform on an animation will result in a memory leak!
     */
    open func `do`(_ callback: @escaping Do) -> Animate {
        animations.enqueue(data: .do(callback))
        return self
    }

     - warning: Not calling finish or perform on an animation will result in a memory leak!
     
     */
    public init(duration: TimeInterval, delay: TimeInterval = 0.0, options: UIViewAnimationOptions = [], animations: @escaping Animation) {
        self.animations.enqueue(data: .animation(duration,delay,options,animations))
    }
    
    /**
     Creates an animation instance with an initial spring animation.
     ```
     //syntax:
     
     let time = 0.5
     
     let animation = Animate(duration: time) {
     // Stuff to animate
     }
     
     animation.perform()
     ```
     - parameter duration: The duration that the animation should take.
     - parameter delay: Takes a time interval to delay the animation.
     - parameter springDamping: Takes the spring damping for the animation. 1.0 gives a smooth animation with a number closer to 0.0 having higher oscillation.
     - parameter initialVelocity: The initial velocity for the view as a ratio of it's distance to it's final position in points per second. If the distance is 200 points then an initial velocity of 0.5 would be 100 points per second.
     - parameter options: Takes a set of UIViewAnimationOptions. Default is none.
     - parameter callback: `Animation` callback to perform over the duration passed in.
     
     - returns: An animation instance.
     
     - warning: Not calling finish or perform on an animation will result in a memory leak!
     
     */
    public init(duration: TimeInterval, delay: TimeInterval = 0.0, springDamping: CGFloat = 1.0, initialVelocity: CGFloat = 0.5, options: UIViewAnimationOptions = [], animations: @escaping Animation) {
        self.animations.enqueue(data: .spring(duration, delay, springDamping, initialVelocity, options, animations))
    }
    
    /**
