private Specification ReplaceValue <TSpec>(
            KeyValueSpecification specification,
            SpecificationValue specValue,
            Func <SpecificationValue, TSpec> factory,
            Func <Specification> baseFactory)
            where TSpec : KeyValueSpecification
        {
            if (specValue.IsReference)
            {
                string key = specValue.Values.Single().ToString();
                if (SpecificationValue.TryFrom(key, this.Values, this.Settings.ValueSettings, out SpecificationValue sv, out string error))
                {
                    return(factory(sv));
                }

                if (sv != null && this.Settings.AllowedUnresolvedValueReferenceKeys.Contains(sv.Values.Single().ToString()))
                {
                    return(factory(sv));
                }

                if (this.Settings.AllowedUnresolvedValueReferenceKeys.Contains(specValue.Values.Single().ToString()))
                {
                    return(baseFactory());
                }

                if (this.Settings.ThrowValueErrors)
                {
                    throw new InvalidOperationException(
                              string.Format(SpecAbsRes.MissingReference, specification, error));
                }
            }

            return(baseFactory());
        }
        private void WriteKeyValueSpecification(KeyValueSpecification specification, string name)
        {
            this.XmlWriter.WriteStartElement(name, this.NameSpace);
            this.WriteKey(specification.Key);
            this.WriteValue(specification.Value);

            this.XmlWriter.WriteEndElement();
        }