 
 public extension ContextAware {
 
-    var context: Context {
+    public var context: Context {
         return self.contextToken!.context
     }
 
-    func contextWrap<Object>(obj: Object) -> Object {
+    public func contextWrap<Object>(obj: Object) -> Object {
         return self.context.wrap(obj)
     }
 
-    func newViewController<ViewController: UIViewController>() -> ViewController {
-        return self.context.wrap(ViewController())
-    }
-
-    func newView<View: UIView>() -> View {
-        return self.context.wrap(View())
+    public func newViewController<ViewController: UIViewController>() -> ViewController {
+        return self.context.newViewController()
+    }
+
+    public func newView<View: UIView>() -> View {
+        return self.context.newView()
     }
 }
 


    private func removeToken(token: ContextToken) {
        self.contextTokens = Set(self.contextTokens.filter({ $0.referent != token }))
    }

    private func setupContextAwareIfNecessary(obj: Any?) {
        guard let contextAware = obj as? ContextAware where contextAware.contextToken == nil else {
            return
        }

        let contextToken = self.generateTokenForContextAware(contextAware)
        contextToken.contextAware = contextAware
        contextAware.contextToken = contextToken
        contextAware.contextAvailable()
    }

    // MARK: Services

    // MARK: Wrapping

    public func wrap<Object>(obj: Object) -> Object {
        if let contextPreloadable = obj as? ContextPreloadable {
            contextPreloadable.contextPreload()
        }
        if let contextAwareContainer = obj as? ContextAwareContainer {
            for child in contextAwareContainer.childObjects {
                self.wrap(child)
            }
        }
        if let viewController = obj as? UIViewController {
            self.wrap(viewController.view)
        }
        self.setupContextAwareIfNecessary(obj)
        return obj
    }

    private func setupContextAwareIfNecessary(obj: Any?) {
        guard let contextAware = obj as? ContextAware where contextAware.contextToken == nil else {
            return
        }

        let contextToken = self.generateTokenForContextAware(contextAware)
        contextToken.contextAware = contextAware
        contextAware.contextToken = contextToken
        contextAware.contextAvailable()
    }

    public func newViewController<ViewController: UIViewController>() -> ViewController {
        return self.wrap(ViewController())
    }

    public func newView<View: UIView>() -> View {
        return self.wrap(View())
    }
}

