static ProGridsInterface()
 {
     // Current release
     for (int i = 0, c = ProGridsEditorTypeNames.Length; i < c && s_ProGridsType == null; i++)
         s_ProGridsType = ReflectionUtility.GetType(ProGridsEditorTypeNames[i]);
 }
        /// <summary>
        /// Generate the [MenuItem()] body for a pb_MenuAction from it's script path.
        /// </summary>
        /// <param name="scriptPath"></param>
        /// <returns></returns>
        static string GenerateMenuItemFunctions(string scriptPath)
        {
            string action        = scriptPath.Replace("\\", "/").Replace(k_MenuActionsFolder, "").Replace(".cs", "");
            string category      = GetActionCategory(action);
            string menu_priority = GetMenuPriority(category);
            string class_name    = GetClassName(action);
            string pretty_path   = Regex.Replace(action, @"(\B[A-Z]+?(?=[A-Z][^A-Z])|\B[A-Z]+?(?=[^A-Z]))", " $0");

            StringBuilder sb = new StringBuilder();
            object        o  = null;

            try
            {
                var type = ReflectionUtility.GetType("UnityEditor.ProBuilder.Actions." + class_name);
                o = System.Activator.CreateInstance(type);
            }
            catch
            {
                Log.Warning("Failed generating menu item for class: \"" + class_name +
                            "\".  File names must match class names.");
                return("");
            }

            PropertyInfo hasMenuEntryProperty = typeof(MenuAction).GetProperty("hasFileMenuEntry", BindingFlags.NonPublic | BindingFlags.Instance);

            if (hasMenuEntryProperty == null || (bool)hasMenuEntryProperty.GetValue(o, null) == false)
            {
                return("");
            }

            PropertyInfo tooltipProperty = typeof(MenuAction).GetProperty("tooltip");
            string       shortcut        = tooltipProperty == null ? "" : GetMenuFormattedShortcut(((TooltipContent)tooltipProperty.GetValue(o, null)).shortcut);

            // VERIFY
            sb.Append("\t\t[MenuItem(");
            sb.Append("k_MenuPrefix + \"");
            sb.Append(pretty_path);
            sb.Append(" ");
            sb.Append(shortcut);
            sb.Append("\", true)]");
            sb.AppendLine("");

            sb.Append("\t\tstatic bool MenuVerify");
            sb.Append(class_name);
            sb.AppendLine("()");

            sb.AppendLine("\t\t{");

            sb.Append("\t\t\t");
            sb.Append(class_name);
            sb.Append(" instance = EditorToolbarLoader.GetInstance<");
            sb.Append(class_name);
            sb.AppendLine(">();");
            sb.AppendLine(@"
            return instance != null && instance.enabled;
    ");
            sb.AppendLine("\t\t}");

            sb.AppendLine("");

            // PERFORM
            sb.Append("\t\t[MenuItem(");
            sb.Append("k_MenuPrefix + \"");
            sb.Append(pretty_path);
            sb.Append(" ");
            sb.Append(shortcut);
            sb.Append("\", false, ");
            sb.Append(menu_priority);
            sb.Append(")]");
            sb.AppendLine("");

            sb.Append("\t\tstatic void MenuDo");
            sb.Append(class_name);
            sb.AppendLine("()");

            sb.AppendLine("\t\t{");

            sb.Append("\t\t\t");
            sb.Append(class_name);
            sb.Append(" instance = EditorToolbarLoader.GetInstance<");
            sb.Append(class_name);
            sb.AppendLine(">();");
            sb.AppendLine("\t\t\tif(instance != null)");
            sb.AppendLine("\t\t\t\tUnityEditor.ProBuilder.EditorUtility.ShowNotification(instance.DoAction().notification);");
            sb.AppendLine("\t\t}");

            return(sb.ToString());
        }