             @.attrArgument = d[1]
             return
 
+    ###
+    eventModifier
+        = 'keydown blur'
+        = ['keydown', 'blur']
+        =
+            event: string or list
+            fn: (event, env) ->
+    ###
+
+    alight.hooks.eventModifier = {}
+
+    setKeyModifier = (name, key) ->
+        alight.hooks.eventModifier[name] =
+            event: ['keydown', 'keypress', 'keyup']
+            fn: (event, env) ->
+                if not event[key]
+                    env.stop = true
+                return
+
+    setKeyModifier 'alt', 'altKey'
+    setKeyModifier 'control', 'ctrlKey'
+    setKeyModifier 'meta', 'metaKey'
+    setKeyModifier 'shift', 'shiftKey'
+
+    formatModifier = (modifier, filterByEvents) ->
+        result = {}
+        if typeof(modifier) is 'string'
+            result.event = modifier
+        else if modifier.event
+            result.event = modifier.event
+
+        if typeof(result.event) is 'string'
+            result.event = result.event.split /\s+/
+
+        if filterByEvents
+            if not result.event or not result.event.length
+                return null
+
+            inuse = false
+            for e in result.event
+                if filterByEvents.indexOf(e) >= 0
+                    inuse = true
+                    break
+            if not inuse
+                return null
+
+        if f$.isFunction modifier
+            result.fn = modifier
+        else if modifier.fn
+            result.fn = modifier.fn
+
+        result
+
     alight.d.al.on =
-        alias: {}
         priority: 10
         init: (scope, element, expression, env) ->
             if not env.attrArgument

            stop: true
            prevent: true
        keyup:
            filtered: true
        keypress:
            filtered: true
        keydown:
            filtered: true

                    scope.$scan()
                return

            for e in eventList
                element.addEventListener e, handler
            scope.$watch '$destroy', ->
                for e in eventList
                    element.removeEventListener e, handler
            return

    directiveOption =
