// Public Methods 

        public static PropertyTranslationInfo FromPropertyInfo(PropertyInfo propInfo)
        {
            var result = new PropertyTranslationInfo();
            var gm     = propInfo.GetGetMethod();
            var sm     = propInfo.GetSetMethod();

            if (gm == null && sm == null)
            {
                throw new Exception(string.Format("Unable to get getter or setter for {0}", propInfo));
            }
            result.IsStatic = (gm != null && gm.IsStatic) ||
                              (sm != null && sm.IsStatic);
            var autoImplemented = IsAutoProperty(propInfo, result.IsStatic);

            if (autoImplemented)
            {
                result.FieldScriptName = propInfo.Name; // just field with the same name
            }
            else
            {
                var name = propInfo.Name;
                result.FieldScriptName = name.Substring(0, 1).ToLower() + name.Substring(1); // lowecase field name
            }
            {
                var at = propInfo.GetCustomAttribute <ScriptNameAttribute>(false);
                if (at != null)
                {
                    result.FieldScriptName = at.Name;// preserve case
                }
            }
            if (autoImplemented)
            {
                result.GetSetByMethod = false;
            }
            else
            {
                result.GetSetByMethod = true;
                if (propInfo.CanRead)
                {
                    result.GetMethodName = propInfo.GetGetMethod().Name;
                }
                if (propInfo.CanWrite)
                {
                    result.SetMethodName = propInfo.GetSetMethod().Name;
                }
            }
            return(result);
        }
        // Public Methods 

        public static PropertyTranslationInfo FromPropertyInfo(PropertyInfo propInfo)
        {
            var result = new PropertyTranslationInfo();
            var gm = propInfo.GetGetMethod();
            var sm = propInfo.GetSetMethod();
            if (gm == null && sm == null)
                throw new Exception(string.Format("Unable to get getter or setter for {0}", propInfo));
            result._isStatic = (gm != null && gm.IsStatic)
                               || (sm != null && sm.IsStatic);
            var autoImplemented = IsAutoProperty(propInfo, result._isStatic);
            if (autoImplemented)
                result.FieldScriptName = propInfo.Name; // just field with the same name 
            else
            {
                var name = propInfo.Name;
                result.FieldScriptName = name.Substring(0, 1).ToLower() + name.Substring(1); // lowecase field name
            }
            {
                var at = propInfo.GetCustomAttribute<ScriptNameAttribute>(false);
                if (at != null)
                    result.FieldScriptName = at.Name;// preserve case
            }
            if (autoImplemented)
            {
                result._getSetByMethod = false;
            }
            else
            {
                result._getSetByMethod = true;
                if (propInfo.CanRead)
                    result.GetMethodName = propInfo.GetGetMethod().Name;
                if (propInfo.CanWrite)
                    result.SetMethodName = propInfo.GetSetMethod().Name;
            }
            return result;
        }