anchor.diff:    return null;
   }
   
  +final RegExp _eventNameRegExp = new RegExp(r'[^a-zA-Z_]');
  +
   String sanitizeEventName(String name) {
  -  return name.replaceAll(new RegExp(r'[^a-zA-Z_]'), '_');
  +  return name.replaceAll(_eventNameRegExp, '_');
   }
  
positive.code:             .toDeclStmt(null, [o.StmtModifier.Final]);
        }
      }
      this._method.addStmts(actionStmts);
    }
  
    void finishMethod() {
      var markPathToRootStart = this._hasComponentHostListener
          ? this.compileElement.appViewContainer.prop('componentView')
          : o.THIS_EXPR;
      o.Expression resultExpr = o.literal(true);
      this._actionResultExprs.forEach((expr) {
        resultExpr = resultExpr.and(expr);
      });
      List<o.Statement> stmts = (new List.from((new List.from((<o.Statement>[
        markPathToRootStart.callMethod('markPathToRootAsCheckOnce', []).toStmt()
      ]))..addAll(this._method.finish())))
        ..addAll([new o.ReturnStatement(resultExpr)]));
      this.compileElement.view.eventHandlerMethods.add(new o.ClassMethod(
          this._methodName,
          [this._eventParam],
          stmts,
  
negative.code: List<CompileEventListener> collectEventListeners(List<BoundEventAst> hostEvents,
      List<DirectiveAst> dirs, CompileElement compileElement) {
    List<CompileEventListener> eventListeners = [];
    for (var hostEvent in hostEvents) {
      compileElement.view.bindings
          .add(new CompileBinding(compileElement, hostEvent));
      var listener = CompileEventListener.getOrCreate(
          compileElement, hostEvent.name, eventListeners);
      listener.addAction(hostEvent, null, null);
    }
    var i = -1;
    for (var directiveAst in dirs) {
      i++;
      var directiveInstance = compileElement.directiveInstances[i];
      for (var hostEvent in directiveAst.hostEvents) {
        compileElement.view.bindings
            .add(new CompileBinding(compileElement, hostEvent));
        var listener = CompileEventListener.getOrCreate(
            compileElement, hostEvent.name, eventListeners);
        listener.addAction(hostEvent, directiveAst.directive, directiveInstance);
      }
    }
    for (int i = 0, len = eventListeners.length; i < len; i++) {
      eventListeners[i].finishMethod();
    }
    return eventListeners;
  }
  
  void bindDirectiveOutputs(DirectiveAst directiveAst,
      o.Expression directiveInstance, List<CompileEventListener> eventListeners) {
    directiveAst.directive.outputs.forEach((observablePropName, eventName) {
      for (int i = 0, len = eventListeners.length; i < len; i++) {
        CompileEventListener listener = eventListeners[i];
        if (listener.eventName != eventName) continue;
        listener.listenToDirective(directiveInstance, observablePropName);
      }
    });
  }
  
  void bindRenderOutputs(List<CompileEventListener> eventListeners) {
    for (int i = 0, len = eventListeners.length; i < len; i++) {
      CompileEventListener listener = eventListeners[i];
      listener.listenToRenderer();
    }
  }
  
  o.Expression convertStmtIntoExpression(o.Statement stmt) {
  