anchor.diff:      return attribute == null || attribute.type == ConfigurationItemAttributeType.required;
     }
   
  -  bool _canVariableHaveExtraKeys(VariableMirror m) {
  +  bool _canHaveExtraKeys(DeclarationMirror m) {
       ConfigurationItemAttribute attribute = m.metadata
           .firstWhere((im) => im.type.isSubtypeOf(reflectType(ConfigurationItemAttribute)), orElse: () => null)
           ?.reflectee;
   
  -    return attribute != null && attribute.allowsExtraKeys == true;
  +    return attribute?.allowsExtraKeys ?? false ;
     }
   
     void _readConfigurationItem(Symbol symbol, VariableMirror mirror, dynamic value) {
  
positive.code:     var reflectedThis = reflect(this);
  
      if (allowsExtraKeys == null) {
        ConfigurationItemAttribute attribute = reflectedThis.type.metadata
            .firstWhere((im) => im.type.isSubtypeOf(reflectType(ConfigurationItemAttribute)), orElse: () => null)
            ?.reflectee;
  
        allowsExtraKeys = attribute != null && attribute.allowsExtraKeys;
      }
  
      var properties = new List<String>();
  
      reflectedThis.type.declarations.forEach((sym, decl) {
        if (decl is! VariableMirror) {
          return;
        }
  
        VariableMirror variableMirror = decl;
        String propertyName = MirrorSystem.getName(sym);
        properties.add(propertyName);
  
        var value = items[propertyName];
  
        if (value != null) {
          _readConfigurationItem(sym, variableMirror, value);
        } else if (_isVariableRequired(sym, variableMirror)) {
          throw new ConfigurationException("${MirrorSystem.getName(sym)} is required but was not found in configuration.");
        }
      });
  
  
negative.code: 
      var decodedValue = null;
      if (mirror.type.isSubtypeOf(reflectType(ConfigurationItem))) {
        decodedValue = _decodedConfigurationItem(mirror.type, value, _canHaveExtraKeys(mirror));
      } else if (mirror.type.isSubtypeOf(reflectType(List))) {
        decodedValue = _decodedConfigurationList(mirror.type, value, _canHaveExtraKeys(mirror));
      } else if (mirror.type.isSubtypeOf(reflectType(Map))) {
        decodedValue = _decodedConfigurationMap(mirror.type, value, _canHaveExtraKeys(mirror));
      } else {
        decodedValue = value;
      }
  