anchor.diff:    static const skipDart = const JsonMLConfig("skipDart");
     static const keyToString = const JsonMLConfig("keyToString");
     static const asClass = const JsonMLConfig("asClass");
  +  static const asObject = const JsonMLConfig("asObject");
  +  toString() => "JsonMLConfig($name)";
   }
   
   int _maxSpanLength = 100;
  
positive.code:       entries.add(new NameValuePair(
            name: entries.length.toString(), value: entryWrapper));
      });
      addMetadataChildren(object, entries);
      return entries.toList();
    }
  }
  
  
negative.code:     var type = dart.getType(object);
      var ret = new LinkedHashSet<NameValuePair>();
      // We use a Set rather than a List to avoid duplicates.
      var fields = new Set<NameValuePair>();
      addPropertiesFromSignature(dart.getFields(type), fields, object, true);
      var getters = new Set<NameValuePair>();
      addPropertiesFromSignature(dart.getGetters(type), getters, object, true);
      ret.addAll(sortProperties(fields));
      ret.addAll(sortProperties(getters));
      addMetadataChildren(object, ret);
      return ret.toList();
    }
  }
  
  /// Show the object instance members and a reduced preview.
  ///
  /// Used as a sub-entry to show the internals of objects that have a different
  /// primary format. For example, a Map shows the key-value pairs, but this makes
  /// the internals of the map visible for debugging.
  class ObjectInternalsFormatter extends ObjectFormatter {
    bool accept(object, config) =>
        super.accept(object, config) && config == JsonMLConfig.asObject;
  
    // A minimal preview because we expect a full preview is already shown in a
    // parent formatter.
    String preview(object) {
      return getObjectTypeName(object);
    }
  }
  
  