anchor.diff:          .toList();
     }
   
  -  void _bindProviders(CompileDirectiveMetadata compMeta,
  +  List<ng.TemplateAst> _bindProviders(CompileDirectiveMetadata compMeta,
         List<ast.TemplateAst> parsedAst, List<ng.TemplateAst> visitedAsts) {
       var providerViewContext =
           new ProviderViewContext(compMeta, parsedAst.first.sourceSpan);
       final providerVisitor = new _ProviderVisitor(providerViewContext);
       final ProviderElementContext providerContext = new ProviderElementContext(
           providerViewContext, null, false, [], [], [], null);
  -    for (var astNode in visitedAsts) {
  -      astNode.visit(providerVisitor, providerContext);
  -    }
  +    return visitedAsts
  +        .map((templateAst) =>
  +            templateAst.visit(providerVisitor, providerContext))
  +        .toList();
     }
   
     void _optimize(CompileDirectiveMetadata compMeta, List<ng.TemplateAst> asts) {
  
positive.code: 
    @override
    ng.TemplateAst visitEvent(ast.EventAst astNode, [_ParseContext context]) {
      var value = context.templateContext.parser
          .parseAction(astNode.value, _location(astNode), const []);
      return new ng.BoundEventAst(astNode.name, value, astNode.sourceSpan);
    }
  
  
negative.code:       List<CompilePipeMetadata> pipes,
        String name) {
      final parsedAst = _parseTemplate(template);
      if (parsedAst.isEmpty) return const [];
      final implicNamespace = _applyImplicitNamespace(parsedAst);
      final desugaredAst = _inlineTemplates(implicNamespace);
      final filteredAst = _filterElements(desugaredAst);
      final boundAsts = _bindDirectives(directives, compMeta, filteredAst);
      final providedAsts = _bindProviders(compMeta, desugaredAst, boundAsts);
      _optimize(compMeta, providedAsts);
      return providedAsts;
    }
  
    List<ast.TemplateAst> _parseTemplate(String template) {
  