 }
 
 
-enum RouteException : Error {
+public enum RouteException : Error {
     case initializerNotFound
     case routeNotFound
     case misformedRoute
 }
 
-struct RouteOptions {
-    
-    var openClass: Routable?
-    var callback : RoutableOpenCallback?
-    
-    init(presentationStyle: UIModalPresentationStyle = UIModalPresentationStyle.none, transitionStyle: UIModalTransitionStyle = UIModalTransitionStyle.coverVertical, defaultParams: RoutableParams? = nil, isRoot: Bool = false, isModal: Bool = false) {
+public struct RouteOptions {
+    
+    public var openClass: Routable?
+    public var callback : RoutableOpenCallback?
+    
+    public init(presentationStyle: UIModalPresentationStyle = UIModalPresentationStyle.none, transitionStyle: UIModalTransitionStyle = UIModalTransitionStyle.coverVertical, defaultParams: RoutableParams? = nil, isRoot: Bool = false, isModal: Bool = false) {
         self.presentationStyle = presentationStyle
         self.transitionStyle = transitionStyle
         self.defaultParams = defaultParams

        }
    }
    
    init(routerOptions: RouteOptions, openParams: RoutableParams?, extraParams: RoutableParams?) {
        self.routeOptions = routerOptions
        self.openParams = openParams
        self.extraParams = extraParams

    /**
    The property determining if the mapped `UIViewController` should be opened modally or pushed in the navigation stack.
    */
    public var isModal : Bool = false
    
    /**
    The property determining the `UIModalPresentationStyle` assigned to the mapped `UIViewController` instance. This is always assigned, regardless of whether or not `modal` is true.
    */
    public var presentationStyle : UIModalPresentationStyle = UIModalPresentationStyle.none
    
    /**
    The property determining the `UIModalTransitionStyle` assigned to the mapped `UIViewController` instance. This is always assigned, regardless of whether or not `modal` is true.
    */
    public var transitionStyle : UIModalTransitionStyle = UIModalTransitionStyle.coverVertical
    /**
    Default parameters sent to the `UIViewController`'s initWithRouteParams: method. This is useful if you want to pass some non-`NSString` information. These parameters will be overwritten by any parameters passed in the URL in open:.
    */
    public var defaultParams : RoutableParams?
    
    /**
    The property determining if the mapped `UIViewController` instance should be set as the root view controller of the router's `UINavigationController` instance.
    */
    public var shouldOpenAsRootViewController : Bool = false
    
}

open class Router {
    
    static let shared = Router()
    
