public void Collect()
        {
            Fx.AssertAndThrow(_expectedStage == Stage.Collect, "Collect called at the wrong time.");
            _expectedStage = Stage.None;

            foreach (IPersistencePipelineModule module in _modules)
            {
                IDictionary <XName, object> readWriteValues;
                IDictionary <XName, object> writeOnlyValues;

                module.CollectValues(out readWriteValues, out writeOnlyValues);
                if (readWriteValues != null)
                {
                    foreach (KeyValuePair <XName, object> value in readWriteValues)
                    {
                        try
                        {
                            _values.Add(value.Key, new InstanceValue(value.Value));
                        }
                        catch (ArgumentException exception)
                        {
                            throw Fx.Exception.AsError(new InvalidOperationException(SRCore.NameCollisionOnCollect(value.Key, module.GetType().Name), exception));
                        }
                    }
                }
                if (writeOnlyValues != null)
                {
                    foreach (KeyValuePair <XName, object> value in writeOnlyValues)
                    {
                        try
                        {
                            _values.Add(value.Key, new InstanceValue(value.Value, InstanceValueOptions.Optional | InstanceValueOptions.WriteOnly));
                        }
                        catch (ArgumentException exception)
                        {
                            throw Fx.Exception.AsError(new InvalidOperationException(SRCore.NameCollisionOnCollect(value.Key, module.GetType().Name), exception));
                        }
                    }
                }
            }

            _expectedStage = Stage.Map;
        }