public override void OnReadValue(Style styleBlock, Css.Value value)
        {
            // Special case for initial and inherit - we use inherit or initial for all it's internal properties:
            if (value is Css.Keywords.Inherit)
            {
                // Foreach property..
                foreach (KeyValuePair <CssProperty, CssPropertySetInfo> kvp in AllProperties)
                {
                    // Set it to its initial/inherited value:
                    styleBlock[kvp.Key] = new Css.Keywords.Inherit(kvp.Key, value.Specifity);
                }

                return;
            }
            else if (value is Css.Keywords.Initial || value == null)
            {
                // Foreach property..
                foreach (KeyValuePair <CssProperty, CssPropertySetInfo> kvp in AllProperties)
                {
                    // Set it to its initial/inherited value:
                    styleBlock[kvp.Key] = new Css.Keywords.Initial(kvp.Key, value.Specifity);
                }

                return;
            }

            // Get the specification:
            Spec.Value spec = Specification;

            if (spec == null)
            {
                return;
            }

            // Load the value now:
            int size;

            spec.OnReadValue(styleBlock, value, 0, out size);

            // Foreach property..
            foreach (KeyValuePair <CssProperty, CssPropertySetInfo> kvp in AllProperties)
            {
                CssPropertySetInfo info = kvp.Value;

                if (info.Set)
                {
                    // Clear:
                    info.Set = false;
                }
                else
                {
                    // Set it to its initial value:
                    styleBlock[kvp.Key] = new Css.Keywords.Initial(kvp.Key, value.Specifity);
                }
            }
        }
        /// <summary>In order to know when certain properties have been set and which have not, each property that a composite property updates
        /// has a 'set info' object. When reading a composite value, all the set info values are checked to see which ones were
        /// not set. It then proceeds to update those to their initial value.</summary>
        public CssPropertySetInfo GetPropertySetInfo(CssProperty prop)
        {
            CssPropertySetInfo result;

            if (!AllProperties.TryGetValue(prop, out result))
            {
                result = new CssPropertySetInfo();
                AllProperties[prop] = result;
            }

            return(result);
        }