 */
 class JTSSloppyNavigationController: UINavigationController {
     
-    private var sloppySwiping: JTSSloppySwiping? = nil
+    private lazy var sloppySwiping: JTSSloppySwiping = {
+        return JTSSloppySwiping(navigationController: self)
+    }()
+    
+    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
+        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
+        self.delegate = self.sloppySwiping
+    }
+
+    required init?(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)
+        self.delegate = self.sloppySwiping
+    }
     
     override init(navigationBarClass: AnyClass?, toolbarClass: AnyClass?) {
         super.init(navigationBarClass: navigationBarClass, toolbarClass: toolbarClass)
+        self.delegate = self.sloppySwiping
     }
     
     override init(rootViewController: UIViewController) {
         super.init(rootViewController: rootViewController)
-    }
-    
-    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
-        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
-        self.sloppySwiping = JTSSloppySwiping(navigationController: self)
-    }
-
-    required init?(coder aDecoder: NSCoder) {
-        super.init(coder: aDecoder)
-        self.sloppySwiping = JTSSloppySwiping(navigationController: self)
+        self.delegate = self.sloppySwiping
     }
 }
 
 /**
-To use this, just initialize it with a navigation controller and keep a strong
-reference to the JTSSloppySwiping instance
+To use this, just initialize it and keep a strong reference to it. You don't 
+actually have to make it your navigation controller's delegate if you need to
+use a different class for that purpose. Just forward the relevant delegate
+methods to your sloppy swiping instance.
 */
 class JTSSloppySwiping: NSObject {
     
-    weak private var navigationController: UINavigationController?
-    
     init(navigationController: UINavigationController) {
+        self.interactivePopAnimator = InteractivePopAnimator()
+        self.popRecognizer = UIPanGestureRecognizer()
         self.navigationController = navigationController
         super.init()
-        navigationController.delegate = self
         self.popRecognizer.addTarget(self, action: "popRecognizerPanned:")
         navigationController.view.addGestureRecognizer(self.popRecognizer)
     }
     
     // MARK: Private
     
+    private weak var navigationController: UINavigationController?
     private var isInteractivelyPopping: Bool = false
-    private var interactivePopAnimator = InteractivePopAnimator()
-    private let popRecognizer = UIPanGestureRecognizer()
-    
+    private var interactivePopAnimator: InteractivePopAnimator
+    private let popRecognizer: UIPanGestureRecognizer
+
     private var isAnimatingANonInteractiveTransition: Bool = false {
         didSet {
             self.popRecognizer.enabled = !self.isAnimatingANonInteractiveTransition
         }
     }
     
-    /*private, basically*/ func popRecognizerPanned(recognizer: UIPanGestureRecognizer) {
+    @objc private func popRecognizerPanned(recognizer: UIPanGestureRecognizer) {
         
         guard let navigationController = self.navigationController else {
             return

    
    private var activeContext: UIViewControllerContextTransitioning? = nil
    private var activeDuration: NSTimeInterval? = nil
    private let defaultDuration: NSTimeInterval = 0.33
    private let shadowView: UIView = {
        let shadowView = UIView(frame: CGRectZero)
        shadowView.backgroundColor = UIColor(white: 0.0, alpha: 0.5)

        }
        
        let maxDistance = container.width
        let maxToViewOffset = maxDistance * maxBackViewTranslationPercentage
        let resolvedToViewOffset = -maxToViewOffset
        let duration = self.durationForDistance(distance: maxDistance, velocity: abs(velocity.x))
        self.activeDuration = duration
