private static void ReturnContext(GenericMenuAddItemContext context)
    {
        context._menu    = null;
        context._content = null;

        s_Pool.Push(context);
    }
    /// <summary>
    /// Begin adding an item to the <see cref="GenericMenu"/>.
    /// </summary>
    /// <example>
    /// <para>Here are some usage examples:</para>
    /// <code language="csharp"><![CDATA[
    /// var menu = new GenericMenu();
    ///
    /// menu.AddItem(new GUIContent("Reset"))
    ///     .Enable(Selection.activeObject != null)
    ///     .Action(() => {
    ///         // Place reset logic here...
    ///     });
    ///
    /// menu.AddItem(new GUIContent("Set as Default Object"))
    ///     .Enable(Selection.activeObject != null)
    ///     .On(Selection.activeObject == currentDefaultObject)
    ///     .Action(() => {
    ///         currentDefaultObject = Selection.activeObject;
    ///     });
    ///
    /// menu.ShowAsContext();
    /// ]]></code>
    /// </example>
    /// <param name="menu">The menu that is being constructed.</param>
    /// <param name="content">Content of menu item.</param>
    /// <returns>
    /// Context object used whilst adding a menu item.
    /// </returns>
    /// <exception cref="System.ArgumentNullException">
    /// <list type="bullet">
    /// <item>If <paramref name="menu"/> is a value of <c>null</c>.</item>
    /// <item>If <paramref name="content"/> is a value of <c>null</c>.</item>
    /// </list>
    /// </exception>
    public static IGenericMenuAddItemContext AddItem(this GenericMenu menu, GUIContent content)
    {
        if (menu == null)
        {
            throw new ArgumentNullException("menu");
        }
        if (content == null)
        {
            throw new ArgumentNullException("content");
        }

        return(GenericMenuAddItemContext.GetContext(menu, content));
    }
    /// <summary>
    /// Begin adding an item to the <see cref="GenericMenu"/>.
    /// </summary>
    /// <example>
    /// <para>Here are some usage examples:</para>
    /// <code language="csharp"><![CDATA[
    /// var menu = new GenericMenu();
    ///
    /// menu.AddItem("Reset")
    ///     .Enable(Selection.activeObject != null)
    ///     .Action(() => {
    ///         // Place reset logic here...
    ///     });
    ///
    /// menu.AddItem("Set as Default Object")
    ///     .Enable(Selection.activeObject != null)
    ///     .On(Selection.activeObject == currentDefaultObject)
    ///     .Action(() => {
    ///         currentDefaultObject = Selection.activeObject;
    ///     });
    ///
    /// menu.ShowAsContext();
    /// ]]></code>
    /// </example>
    /// <param name="menu">The menu that is being constructed.</param>
    /// <param name="text">Text of menu item.</param>
    /// <returns>
    /// Context object used whilst adding a menu item.
    /// </returns>
    /// <exception cref="System.ArgumentNullException">
    /// <list type="bullet">
    /// <item>If <paramref name="menu"/> is a value of <c>null</c>.</item>
    /// <item>If <paramref name="text"/> is a value of <c>null</c>.</item>
    /// </list>
    /// </exception>
    /// <exception cref="System.ArgumentException">
    /// If <paramref name="text"/> is an empty string.
    /// </exception>
    public static IGenericMenuAddItemContext AddItem(this GenericMenu menu, string text)
    {
        if (menu == null)
        {
            throw new ArgumentNullException("menu");
        }
        if (text == null)
        {
            throw new ArgumentNullException("text");
        }
        if (text == "")
        {
            throw new ArgumentException("Empty string.", "text");
        }

        return(GenericMenuAddItemContext.GetContext(menu, GetContent(text)));
    }