             r = f.match(current)
             if r && !result
               result = true
-              f = part[1]
-              if f.handle_event
-                f.handle_event(null, f.args)
+              z = part[1]
+              if z.handle_event
+                z.handle_event(null, f.args)
               else
-                f.apply(null, f.args)
+                z.apply(null, f.args)
               return
 
         #when no results, then call 404 or empty function

    ###
    extract = (property) =>
      p = params[property]
      k = @controller["#{property}_#{act}"]
      err = (a) ->
        "#{a} action must be string or function"
      if SiriusUtils.is_string(p)
        t = @controller[p]
        throw err(SiriusUtils.camelize(property)) if !SiriusUtils.is_function(t)
        t
      else if SiriusUtils.is_function(p)

    @data = params['data'] || null

  # e is a event need extract event target
  handle_event: (e, args...) ->
    @before()

    #when e defined it's a Event, otherwise it's call from url_routes
    if e
      if @data
        @data = if SiriusUtils.is_array(@data) then @data else [@data]
        data = SiriusApplication.adapter.get_property(e, @data)
        @action.apply(null, [].concat([], [e], data)) 
      else
        @action.apply(null, [e])
    else
      @action.apply(null, args)

    @after(null)



