anchor.diff:      .toList();
   }
   
  +Map<String, Map<String, Object>> attributesToMap(
  +    Iterable<DeclarationMirror> declarations, TypeMirror from) {
  +  var map = new Map<String, Map<String, Object>>();
  +  for (var d in declarations) {
  +    if (d is VariableMirror && !d.isPrivate) {
  +      print("-- Variable: " + MirrorSystem.getName(d.simpleName).toString() + " --");
  +      map[MirrorSystem.getName(d.simpleName)] = variableToMap(d, from);
  +    }
  +    else if (d is MethodMirror && d.isGetter) {
  +      print("-- Method:   " + MirrorSystem.getName(d.simpleName).toString() + " --");
  +      map[MirrorSystem.getName(d.simpleName)] = methodToMap(d, from);
  +    }
  +  }
  +  return map;
  +}
  +
   Map<String, Map<String, Object>> methodsToMap(
       Iterable<DeclarationMirror> declarations, TypeMirror from) {
     var map = new Map<String, Map<String, Object>>();
     for (var d in declarations) {
  -    if (d.simpleName != #then
  -        && d.simpleName != #whenComplete
  -        && d.simpleName != #listen
  -        && d.simpleName != #doWhile
  -        && d.simpleName != #endsWith
  -        && d.simpleName != #matchAsPrefix
  -        && d.simpleName != #padLeft) {
  -      continue;
  -    }
  -    if (d is MethodMirror) {
  +    if (d is MethodMirror && d.isRegularMethod) {
         print("-- Method: " + MirrorSystem.getName(d.simpleName).toString() + " --");
         map[MirrorSystem.getName(d.simpleName)] = methodToMap(d, from);
       }
  +  }
  +  return map;
  +}
  +
  +Map<String, Object> variableToMap(VariableMirror mm, TypeMirror from) {
  +  var map = new Map();
  +  map[keyType] = typeToMap(mm.type, from); // TODO what about void?
  +
  +  if (!mm.isFinal && !mm.isConst) {
  +    map["\$set"] = { keyMetatype : metatypeSetter };
  +  }
  +  map[keyMetatype] = metatypeGetter;
  +  map[keyName] = MirrorSystem.getName(mm.simpleName);
  +  map[keyPackedAnns] = 5; // TODO 'shared formal' for now
  +
  +  if (mm.isStatic) {
  +    map[keyStatic] = true;
     }
     return map;
   }
  
positive.code:     map[keyTypeParams] = typeParameters;
    }
  
    if (cm.superclass != reflectClass(Object)) {
      map["super"] = typeToMap(cm.superclass, from, true);
    }
  
    // satisfy the corresponding Ceylon interface
    List<ClassMirror> interfaces = [cm];
    map[keySatisfies] = [typeToMap(cm, from)];
  
    // print("satisfies (c): " + map[keySatisfies].toString());
  
negative.code:   if (!typeParameters.isEmpty) {
      map[keyTypeParams] = typeParameters;
    }
  
    // FIXME always satisfy Identifiable
  
    List<ClassMirror> interfaces = [cm.superclass];
    interfaces.addAll(cm.superinterfaces);
    map[keySatisfies] = interfaces
      .where((t) {
        return t != null
          && !t.isPrivate
          && t.owner != null
          && t != reflectClass(Object)
          // TODO make this configurable
          // exclude dart._internal.EfficientLength and others?
          && MirrorSystem.getName(t.owner.qualifiedName) != "dart._internal";
      })
      .map((m) => typeToMap(m, from)).toList();
  
  