public void Map() { Fx.AssertAndThrow(_expectedStage == Stage.Map, "Map called at the wrong time."); _expectedStage = Stage.None; List <Tuple <IPersistencePipelineModule, IDictionary <XName, object> > > pendingValues = null; foreach (IPersistencePipelineModule module in _modules) { IDictionary <XName, object> mappedValues = module.MapValues(_readWriteView, _writeOnlyView); if (mappedValues != null) { if (pendingValues == null) { pendingValues = new List <Tuple <IPersistencePipelineModule, IDictionary <XName, object> > >(); } pendingValues.Add(new Tuple <IPersistencePipelineModule, IDictionary <XName, object> >(module, mappedValues)); } } if (pendingValues != null) { foreach (Tuple <IPersistencePipelineModule, IDictionary <XName, object> > writeOnlyValues in pendingValues) { foreach (KeyValuePair <XName, object> value in writeOnlyValues.Item2) { try { _values.Add(value.Key, new InstanceValue(value.Value, InstanceValueOptions.Optional | InstanceValueOptions.WriteOnly)); } catch (ArgumentException exception) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.NameCollisionOnMap(value.Key, writeOnlyValues.Item1.GetType().Name), exception)); } } } _writeOnlyView.ResetCaches(); } _expectedStage = Stage.Save; }