     var transitionDuration: TimeInterval? { get set }
 }
 
-class PopKitPresentationAnimator: NSObject, UIViewControllerAnimatedTransitioning, TransitionDuration {
-    var kit: PopKit
-    var transitionDuration: TimeInterval?
-    
-    init(with kit: PopKit) {
-        self.kit = kit
-    }
-    
-    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
-        return transitionDuration ?? 0.7
-    }
-    
-    fileprivate func animateSlideAndScale(_ transitionContext: UIViewControllerContextTransitioning, _ controller: PopKitPresentationController, _ initialFrame: CGRect, _ finalFrame: CGRect) {
+protocol PopKitAnimator { }
+
+extension PopKitAnimator where Self: UIViewControllerAnimatedTransitioning {
+    
+    func animateSlideAndScale(_ transitionContext: UIViewControllerContextTransitioning, _ controller: PopKitPresentationController, _ initialFrame: CGRect, _ finalFrame: CGRect) {
         let animationDuration = transitionDuration(using: transitionContext)
         controller.presentedViewController.view.frame = initialFrame
         UIView.animate(withDuration: animationDuration, animations: {

        }
    }
    
    fileprivate func animateBounce(_ damping: Float, _ velocity: Float, _ transitionContext: UIViewControllerContextTransitioning, _ controller: PopKitPresentationController, _ initialFrame: CGRect, _ finalFrame: CGRect) {
        let animationDuration = transitionDuration(using: transitionContext)
        controller.presentedViewController.view.frame = initialFrame
        

enum PopKitAnimation {
    case zoomIn(Float)
    case zoomOut(Float)
    case slideTop
    case slideLeft
    case slideRight
    case slideBottom
    case bounceTop(damping: Float, velocity: Float)
    case bounceLeft(damping: Float, velocity: Float)
    case bounceRight(damping: Float, velocity: Float)
    case bounceBottom(damping: Float, velocity: Float)
}

enum PopKitBackgroundEffect {
