anchor.diff:  
   class JsonStorageType extends StorageType {
     const JsonStorageType();
  -  
  -  @override
  -  Map<String, dynamic> decode(String input) =>
  -      JSON.decode(input);
  -
  -  @override
  -  String encode(Map<String, dynamic> input) =>
  -      new JsonEncoder.withIndent("  ").convert(input);
  +
  +  @override
  +  Map<String, dynamic> decode(String input) => JSON.decode(input, reviver: (key, value) {
  +    if (value is! String) return value;
  +
  +    try {
  +      return DateTime.parse(value);
  +    } on FormatException catch (e) {
  +      return value;
  +    }
  +  });
  +
  +  @override
  +  String encode(Map<String, dynamic> input) => new JsonEncoder.withIndent("  ", (value) {
  +    if (value is DateTime) {
  +      return value.toString();
  +    } else {
  +      return value;
  +    }
  +  }).convert(input);
   }
   
   abstract class StorageType {
     static const StorageType JSON = const JsonStorageType();
  -  
  +
     const StorageType();
  -  
  +
     String encode(Map<String, dynamic> input);
     Map<String, dynamic> decode(String input);
   }
   
   class Storage extends StorageContainer {
     final String path;
  -  
  +
     StorageType type = StorageType.JSON;
     List<StorageChecker> _checkers = [];
     Map<String, dynamic> _entries;
     Timer _timer;
  -  
  +
     Storage(this.path);
  -  
  +
     bool _changed = false;
   
     void load() {
       var file = new File(path);
  -    
  +
       if (!file.existsSync()) {
         _entries = {};
       } else {
         var content = file.readAsStringSync();
         var map = type.decode(content);
  -      
  +
         if (map is! Map) {
           throw new Exception("JSON was not a map!");
         }
  
positive.code:   void onChange() {
      _changed = true;
    }
    
    void delete() {
      destroy();
      var file = new File(path);
  
negative.code:       file.deleteSync();
      }
    }
  
    bool get hasChangePending => _changed;
  }
  
  class SubStorage extends StorageContainer {
    final StorageContainer parent;
    final String key;
  
    SubStorage(this.parent, this.key) {
      if (!parent.entries.containsKey(key)) {
        parent.entries[key] = {};
        parent.onChange();
      }
    }
  
    @override
    Map<String, dynamic> get entries => parent.entries[key];
  
  