anchor.diff:    void reportEachMethodThing(String methodCategory, DiffNode d) {
       d.forEachAdded((k, v) {
         //print("New ${singularize(methodCategory)} '$k': ${pretty(v)}");
  -      io.writeln("New ${singularize(methodCategory)} [$k](#):\n");
  -      io.writeln("```dart");
  -      io.writeln(methodSignature(v as Map));
  -      io.writeln("```");
  -      io.writeln("");
  +      io.writeln(
  +"""New ${singularize(methodCategory)} [$k](#):
  +
  +```dart
  +${methodSignature(v as Map)}
  +```
  +---
  +""");
       });
       
       d.forEachRemoved((k, v) {
         //print("New ${singularize(methodCategory)} '$k': ${pretty(v)}");
         if (k == '') { k = diff.metadata['name']; }
  -      io.writeln("Removed ${singularize(methodCategory)} [$k](#):\n");
  -      io.writeln("```dart");
  -      io.writeln(methodSignature(v as Map, includeComment: false));
  -      io.writeln("```");
  -      io.writeln("");
  +      io.writeln(
  +"""Removed ${singularize(methodCategory)} [$k](#):
  +
  +```dart
  +${methodSignature(v as Map, includeComment: false)}
  +```
  +---
  +""");
       });
             
       // iterate over the methods
  
positive.code:         //print("The '$method' in '$methodCategory' has a new $name: '$k': ${pretty(v)}");
          String category = singularize(methodCategory);
          io.writeln("The [$method](#) ${category} has a new ${singularize(name)}: `${parameterSignature(v as Map)}`");
          io.writeln("");
        });
      });
      
  
negative.code:   }
  
    void report() {
      Map<String,PackageSdk> diffsBySubpackage = new Map();
      diff.forEach((String file, DiffNode node) {
        if (node.metadata["packageName"] != null) {
          String subpackage = node.metadata["qualifiedName"];
          if (!diffsBySubpackage.containsKey(subpackage)) {
            diffsBySubpackage[subpackage] = new PackageSdk();
          }
          diffsBySubpackage[subpackage].package = node;
        } else {
          String subpackage = getSubpackage(node);
          if (!diffsBySubpackage.containsKey(subpackage)) {
            diffsBySubpackage[subpackage] = new PackageSdk();
          } else {
            diffsBySubpackage[subpackage].classes.add(node);
          }
        }
      });
  
      diffsBySubpackage.forEach((String name, PackageSdk p) {
        setIo(name);
        reportFile(p.package);
        p.classes.forEach(reportFile);
      });
    }
    
    void setIo(String packageName) {
      if (out == null) {
        io = stdout;
        return;
      }
  
      Directory dir = new Directory(out)..createSync(recursive: true);
      io = (new File('$out/$packageName.markdown')..createSync(recursive: true)).openWrite();
      writeMetadata(packageName);
    }
    
    void writeMetadata(String packageName) {
      io.writeln("""---
  layout: page
  title: $packageName
  permalink: /$packageName/
  ---""");
    }
  
    void reportFile(DiffNode d) {
      new FileReporter("xxx", d, io: io).report();
    }
    
    String getSubpackage(DiffNode node) {
      return (node.metadata["qualifiedName"]).split('.')[0];
    }
  }
  
  