     
 }
 
-private let defaultCancelPopDuration: TimeInterval = 0.16
-private let maxBackViewTranslationPercentage: CGFloat = 0.30
-private let minimumDismissalPercentage: CGFloat = 0.5
-private let minimumThresholdVelocity: CGFloat = 100.0
-
-private class InteractivePopAnimator: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerInteractiveTransitioning {
+fileprivate let defaultCancelPopDuration: TimeInterval = 0.16
+fileprivate let maxBackViewTranslationPercentage: CGFloat = 0.30
+fileprivate let minimumDismissalPercentage: CGFloat = 0.5
+fileprivate let minimumThresholdVelocity: CGFloat = 100.0
+
+@objc(JTSInteractivePopAnimator)
+fileprivate class InteractivePopAnimator: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerInteractiveTransitioning {
+    
+    // MARK: Fileprivate Properties
     
     var translation: CGPoint = CGPoint.zero {
         didSet {

        activeContext?.finishInteractiveTransition()
        
        UIView.animate(withDuration: duration,
            delay: 0,
            options: options,
            animations: { () -> Void in
                self.frontContainerView.transform = CGAffineTransform(
                    translationX: maxDistance, y: 0
                )
                toView.transform = .identity
                self.backOverlayView.alpha = 0.0
                self.frontContainerView.dropShadowView.alpha = 0.0
            },
            completion: { (completed) -> Void in
                fromView.removeFromSuperview()
                self.frontContainerView.transform = .identity
                self.frontContainerView.removeFromSuperview()
                self.backOverlayView.removeFromSuperview()
                self.activeContext?.completeTransition(true)
                completion()
            }
        )
        
    }
    
    func percentDismissedForTranslation(_ translation: CGPoint, container: UIView) -> CGFloat {
        let maxDistance = container.bounds.size.width
        return (min(maxDistance, max(0, translation.x))) / maxDistance
    }
    
    func durationForDistance(distance d: CGFloat, velocity v: CGFloat) -> TimeInterval {
        let minDuration: CGFloat = 0.08
        let maxDuration: CGFloat = 0.4
        return (TimeInterval)(max(min(maxDuration, d / v), minDuration))

        commonInit()
    }
    
    // MARK: Private Methods
    
    private func commonInit() {
        var dropShadowFrame = dropShadowView.frame
        dropShadowFrame.origin.x = 0 - dropShadowFrame.size.width
        dropShadowFrame.origin.y = 0
