private RouteRequest(RoutePointRequestable origin,
            RoutePointRequestable destination, RouteSettings settings,
            Route currentRoute, int rerouteReason) {
        super();
        
        // data validation
        if(origin == null) {
            throw new IllegalArgumentException("Origin cannot be null");
        } else if(destination == null) {
            throw new IllegalArgumentException("Destination cannot be null");
        } else if(settings == null) {
            throw new IllegalArgumentException("Settings cannot be null");
        } else if(currentRoute != null) {
            // check valid reroute reason
            switch(rerouteReason) {
            case REASON_OFF_TRACK:
            case REASON_TRAFFIC_INFO_UPDATE:
            case REASON_TRUNCATED_ROUTE:
            case REASON_UNKNOWN:
            case REASON_USER_REQUEST:
                // OK!
                break;
            
            default:
                throw new IllegalArgumentException("Invalid reroute reason");
            }
        }
        
        m_origin = origin;
        m_destination = destination;
        m_routeSettings = settings;
        m_currentRoute = currentRoute;
        m_rerouteReason = rerouteReason;
    }