Inheritance: System.Attribute
        /// <summary>
        ///		Returns an actual enum value for a enum that can be used in script files.
        /// </summary>
        /// <param name="val"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public static object Lookup(string val, Type type)
        {
            // get the list of fields in the enum
            FieldInfo[] fields = type.GetFields();

            // loop through each one and see if it is mapped to the supplied value
            for (int i = 0; i < fields.Length; i++)
            {
                FieldInfo field = fields[i];

                // find custom attributes declared for this field
                object[] atts = field.GetCustomAttributes(typeof(ScriptEnumAttribute), false);

                // if we found 1, take a look at it
                if (atts.Length > 0)
                {
                    // convert the first element to the right type (assume there is only 1 attribute)
                    ScriptEnumAttribute scriptAtt = (ScriptEnumAttribute)atts[0];

                    // if the values match
                    if (scriptAtt.ScriptValue == val)
                    {
                        // return the enum value for this script equivalent
                        return(Enum.Parse(type, field.Name, true));
                    }
                } // if
            }     // for

            //	invalid enum value
            return(null);
        }
        /// <summary>
        ///		Returns a string describing the legal values for a particular enum.
        /// </summary>
        /// <param name="type"></param>
        /// <returns>
        ///		A string containing legal values for script file.
        ///		i.e. "'none', 'clockwise', 'anticlockwise'"
        /// </returns>
        public static string GetLegalValues(Type type)
        {
            StringBuilder legalValues = new StringBuilder();

            // get the list of fields in the enum
            FieldInfo[] fields = type.GetFields();

            // loop through each one and see if it is mapped to the supplied value
            for (int i = 0; i < fields.Length; i++)
            {
                FieldInfo field = fields[i];

                // find custom attributes declared for this field
                object[] atts = field.GetCustomAttributes(typeof(ScriptEnumAttribute), false);

                // if we found 1, take a look at it
                if (atts.Length > 0)
                {
                    // convert the first element to the right type (assume there is only 1 attribute)
                    ScriptEnumAttribute scriptAtt = (ScriptEnumAttribute)atts[0];

                    // if the values match
                    legalValues.AppendFormat("'{0}',", scriptAtt.ScriptValue);
                }         // if
            }             // for

            // return the full string
            if (legalValues.Length == 0)
            {
                return("(No values found for type " + type.Name.ToString() + ")");
            }
            else
            {
                return(legalValues.ToString(0, legalValues.Length - 1));
            }
        }