/// <summary>
        /// Composes the value.
        /// </summary>
        /// <param name="itemValue">
        /// The item value.
        /// </param>
        /// <param name="writer">
        /// The writer.
        /// </param>
        /// <exception cref="System.ArgumentException">
        /// Unsupported
        /// </exception>
        private static void ComposeValue(PListValue itemValue, XmlWriter writer)
        {
            switch (itemValue.PropertyType)
            {
            case "string":
            case "integer":
            case "real":
                writer.WriteElementString(itemValue.PropertyType, itemValue.Value.ToString());
                break;

            case "true":
            case "false":
                writer.WriteElementString(itemValue.PropertyType, string.Empty);
                break;

            case "dict":
                ComposeDictionary(itemValue.Value, writer);
                break;

            case "array":
                ComposeArray(itemValue.Value as List <PListValue>, writer);
                break;

            default:
                throw new ArgumentException("Unsupported");
            }
        }
        /// <summary>
        /// Parses the value.
        /// </summary>
        /// <param name="val">
        /// The value.
        /// </param>
        /// <returns>
        /// The <see cref="PListValue"/>.
        /// </returns>
        /// <exception cref="System.ArgumentException">
        /// Unsupported
        /// </exception>
        private static PListValue ParseValue(XElement val)
        {
            var itemValue = new PListValue {
                PropertyType = val.Name.ToString()
            };

            switch (itemValue.PropertyType)
            {
            case "string":
                itemValue.Value = val.Value;
                break;

            case "integer":
                itemValue.Value = int.Parse(val.Value);
                break;

            case "real":
                itemValue.Value = float.Parse(val.Value);
                break;

            case "true":
                itemValue.Value = true;
                break;

            case "false":
                itemValue.Value = false;
                break;

            case "dict":
                var plist = new PList();
                Parse(plist, val.Elements());
                itemValue.Value = plist;
                break;

            case "array":
                var list = ParseArray(val.Elements());
                itemValue.Value = list;
                break;

            default:
                throw new ArgumentException("Unsupported");
            }

            return(itemValue);
        }