 
 		decorationInsetsAnimation = nil
 		decorationInsetsAreValid = true
+	}
+
+
+	@objc(JetPack_viewWasCoveredByViewController:animated:)
+	public func viewWasCoveredByViewController(viewController: UIViewController, animated: Bool) {
+		// override in subclasses
+	}
+
+
+	@objc(JetPack_viewWasUncoveredByViewController:animated:)
+	public func viewWasUncoveredByViewController(viewController: UIViewController, animated: Bool) {
+		// override in subclasses
+	}
+
+
+	@objc(JetPack_viewWillBeCoveredByViewController:animated:)
+	public func viewWillBeCoveredByViewController(viewController: UIViewController, animated: Bool) {
+		// override in subclasses
+	}
+
+
+	@objc(JetPack_viewWillBeUncoveredByViewController:animated:)
+	public func viewWillBeUncoveredByViewController(viewController: UIViewController, animated: Bool) {
+		// override in subclasses
 	}
 
 

	@nonobjc
	public func presentViewController(viewControllerToPresent: UIViewController, completion: Closure? = nil) {
		presentViewController(viewControllerToPresent, animated: true, completion: completion)
	}



	private func swizzled_viewWillDisappear(animated: Bool) {
		self.appearState = .WillDisappear

		if isBeingDismissed() && parentViewController == nil, let presentingViewController = self.presentingViewController where presentingViewController === presentingViewControllerForCurrentCoverageCallbacks {
			presentingViewController.traverseViewControllerSubtreeFromHereIncludingPresentedViewControllers(false) { viewController in
				guard viewController.appearState == .DidAppear else {
					return
				}

				viewController.viewWillBeUncoveredByViewController(self, animated: animated)
			}
		}

		swizzled_viewWillDisappear(animated)
	}

