         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.

    case animation(TimeInterval, TimeInterval, UIViewAnimationOptions, Animation)
    
    /**
     Wait operation.
     
     - parameter _: `TimeInterval?` to to resume by if resume is not called by the `Wait` block. Pass in `nil` to disable timeout.

     animation.perform()
     ```
     - parameter duration: The duration that the animation should take.
     - parameter delay: Takes a time interval to delay the animation.
     - 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.
