     @data = params['data'] || null
 
   # e is a event need extract event target
-
   handle_event: (e, args...) ->
-    @before.call(null)
+    @before()
 
     #when e defined it's a Event, otherwise it's call from url_routes
     if e
       if @data
-        @action.apply(null, [e])#FIXME add 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.call(null)
+    @after(null)
 
 
 

    ###
    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)

    create: (routes, fn = ->) ->
      current = prev = window.location.hash

      for url, action of routes when url.indexOf("#") != 0 && url.toString() != "404"
        do (url, action) =>
          handler = if SiriusUtils.is_function(action)
                     action
                   else
                    (e) ->
                      (new ControlFlow(action)).handle_event(e)

          z = url.match(/^([a-zA-Z:]+)(\s+)?(.*)?/)
          event_name = z[1]
          selector   = z[3] || document #when it a custom event: 'custom:event' for example
          SiriusApplication.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 url.toString() != "404"
        do (url, action) ->
          url    = new RoutePart(url)
          action = if SiriusUtils.is_function(action) then action else new ControlFlow(action)
          [url, action]

      window.onhashchange = (e) =>
