internal void CheckRegularExpression(RibbonDefinition obj, string fieldName, string pattern)
        {
            string value = (string)obj.GetType().GetField(fieldName).GetValue(obj);

            if (!pattern.StartsWith("^"))
            {
                pattern = "^" + pattern;
            }

            if (!pattern.EndsWith("$"))
            {
                pattern += "$";
            }

            if (value == null || !new Regex(pattern).Match(value).Success)
            {
                throw new ValidationException(
                          String.Format("{0}{1}: Validation failed! {2} has value '{3}', which doesn't match validation pattern '{4}'.",
                                        obj.GetType().Name,
                                        obj.Id != null ? " (id='" + obj.Id + "')" : String.Empty,
                                        fieldName,
                                        value == null ? String.Empty : value,
                                        pattern
                                        )
                          );
            }
        }
        internal void CheckNotNull(RibbonDefinition obj, string fieldName)
        {
            object value = obj.GetType().GetField(fieldName).GetValue(obj);

            if (value == null)
            {
                throw new ValidationException(
                          String.Format("{0}{1}: Validation failed! {2} is required.",
                                        obj.GetType().Name,
                                        obj.Id != null ? " (id='" + obj.Id + "')" : String.Empty,
                                        fieldName
                                        )
                          );
            }
        }
        internal void CheckIntRange(RibbonDefinition obj, string fieldName, int minimum, int maximum)
        {
            int value = (int)obj.GetType().GetField(fieldName).GetValue(obj);

            if (value < minimum || value > maximum)
            {
                throw new ValidationException(
                          String.Format("{0}{1}: Validation failed! {2} has value {3}, which is outside of allowed range [{4}..{5}].",
                                        obj.GetType().Name,
                                        obj.Id != null ? " (id='" + obj.Id + "')" : String.Empty,
                                        fieldName,
                                        value,
                                        minimum,
                                        maximum
                                        )
                          );
            }
        }
        internal void CheckArrayHasElements(RibbonDefinition obj, string fieldName)
        {
            IEnumerable <RibbonDefinition> value;

            if (obj.GetType().GetMember(fieldName).First().MemberType == MemberTypes.Property)
            {
                value = (IEnumerable <RibbonDefinition>)obj.GetType().GetProperty(fieldName).GetValue(obj, null);
            }
            else
            {
                value = (IEnumerable <RibbonDefinition>)obj.GetType().GetField(fieldName).GetValue(obj);
            }

            if (value == null || value.Count() == 0)
            {
                throw new ValidationException(
                          String.Format("{0}{1}: Validation failed! {2} is required to have at least one element.",
                                        obj.GetType().Name,
                                        obj.Id != null ? " (id='" + obj.Id + "')" : String.Empty,
                                        fieldName
                                        )
                          );
            }
        }