     @start = null #not used ...
     @parts = []
     @args  = []
-    # #/abc/dsa/ => ["#", "abc", "dsa"]
+    # #/abc/dsa/ => ["#", "abc", "dsa"] or ["", "abc", "dsa"]
     parts = route.replace(/\/$/, "").split("/")
 
     # mark, this route not have a length and end

      Sirius.Application.adapter.bind(selector, event_name, handler)

    # for cache change obj[k, v] to array [[k,v]]
    array_of_routes = for url, action of routes when @_hash_route(url) && !@_404_route(url) && !@_plain_route(url)
      url    = new Sirius.RoutePart(url)
      action = if Sirius.Utils.is_function(action) then action else new Sirius.ControlFlow(action)
      [url, action]
    c array_of_routes
    window.onhashchange = (e) =>
      prev = current
      current = window.location.hash
      result = false

      Sirius.Application.logger("Url change to: #{current}")
      Sirius.Application.adapter.fire(document, "application:hashchange", current, prev)

      #call first matched function
      for part in array_of_routes
        f = part[0]
        r = f.match(current)
        if r && !result

    return false if ((parts.length != @parts.length) && @end)
    #when it have a different length, but @parts len > given len
    return false if (@parts.length > 1) && parts.length < @parts.length
    # when not end, and last parts not the equals
    return false if @end && (parts[parts.length-1] != @parts[parts.length-1])

    is_named_part = (part) ->
      part.indexOf(":") == 0
