     let before = Animator()
     let present = Animator()
 
-    override init()  {
-    }
+    func animate(context: UIViewControllerContextTransitioning) {
 
-    func start(context: UIViewControllerContextTransitioning) {
-        if duration == 0.0 {
-            setup(context)
+        setup(context)
+
+        before.completion = {
+            self.startTransition(context)
         }
-        _startBefore(context)
+
+        before.start()
     }
 }
 
 extension Manager: UIViewControllerAnimatedTransitioning {
 
     func animateTransition(context: UIViewControllerContextTransitioning) {
-        start(context)
+        animate(context)
     }
 
     func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {

    }
}

extension Manager {

    // MARK: setup tasks before running

    private func setup(context: UIViewControllerContextTransitioning) {
        let fromViewController = context.viewControllerForKey(UITransitionContextFromViewControllerKey)
        let toViewController = context.viewControllerForKey(UITransitionContextToViewControllerKey)

        if let fromViewController = fromViewController, let toViewController = toViewController {
            _setupTasks(fromViewController: fromViewController, toViewController: toViewController)
        }
    }

    private func findViewControllerIn(viewController: UIViewController) -> UIViewController {

        switch viewController {
        case let navigationController as UINavigationController:
            return navigationController.topViewController
        default:
            break
        }

        return viewController
    }

    private func _setupTasks(#fromViewController: UIViewController, toViewController: UIViewController) {
        // before
        let fromViewController = findViewControllerIn(fromViewController)
        let toViewController = findViewControllerIn(toViewController)

        }
        present.start()
    }

    func findViewControllerIn(viewController: UIViewController) -> UIViewController {

        switch viewController {
        case let navigationController as UINavigationController:
            return navigationController.topViewController
        default:
            break
        }

        return viewController
    }
}

public func animate() -> UIViewControllerAnimatedTransitioning? {
