ToolbarButtonWrapper: Changed to a static factory style to keep all of the reflection code in ToolbarButtonWrapper. toolbarwrapper_static_factory
ToolbarButtonWrapper: Changed to a static factory style to keep all of the reflection code in ToolbarButtonWrapper.

--- a/ToolbarButtonWrapper.cs
+++ b/ToolbarButtonWrapper.cs
@@ -25,11 +25,104 @@
 
 namespace VOID
 {
+	/// <summary>
+	/// Wraps a Toolbar clickable button, after fetching it from a foreign assembly.
+	/// </summary>
 	internal class ToolbarButtonWrapper
 	{
-		protected System.Type ToolbarManager;
-		protected object TBManagerInstance;
-		protected MethodInfo TBManagerAdd;
+		protected static System.Type ToolbarManager;
+		protected static object TBManagerInstance;
+		protected static MethodInfo TBManagerAdd;
+
+		/// <summary>
+		/// Wraps the ToolbarManager class, if present.
+		/// </summary>
+		/// <returns><c>true</c>, if ToolbarManager is wrapped, <c>false</c> otherwise.</returns>
+		protected static bool TryWrapToolbarManager()
+		{
+			if (ToolbarManager == null)
+			{
+				Tools.PostDebugMessage(string.Format(
+					"{0}: Loading ToolbarManager.",
+					"ToolbarButtonWrapper"
+					));
+
+				ToolbarManager = AssemblyLoader.loadedAssemblies
+					.Select(a => a.assembly.GetExportedTypes())
+						.SelectMany(t => t)
+						.FirstOrDefault(t => t.FullName == "Toolbar.ToolbarManager");
+
+				Tools.PostDebugMessage(string.Format(
+					"{0}: Loaded ToolbarManager.  Getting Instance.",
+					"ToolbarButtonWrapper"
+					));
+
+				if (ToolbarManager == null)
+				{
+					return false;
+				}
+
+				TBManagerInstance = ToolbarManager.GetProperty(
+					"Instance",
+					System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static
+					)
+					.GetValue(null, null);
+
+				Tools.PostDebugMessage(string.Format(
+					"{0}: Got ToolbarManager Instance '{1}'.  Getting 'add' method.",
+					"ToolbarButtonWrapper",
+					TBManagerInstance
+					));
+
+				TBManagerAdd = ToolbarManager.GetMethod("add");
+
+				Tools.PostDebugMessage(string.Format(
+					"{0}: Got ToolbarManager Instance 'add' method.  Loading IButton.",
+					"ToolbarButtonWrapper"
+					));
+			}
+
+			return true;
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether <see cref="Toolbar.ToolbarManager"/> is present.
+		/// </summary>
+		/// <value><c>true</c>, if ToolbarManager is wrapped, <c>false</c> otherwise.</value>
+		public static bool ToolbarManagerPresent
+		{
+			get
+			{
+				return TryWrapToolbarManager();
+			}
+		}
+
+		/// <summary>
+		/// If ToolbarManager is present, initializes a new instance of the <see cref="VOID.ToolbarButtonWrapper"/> class.
+		/// </summary>
+		/// <param name="ns">Namespace, usually the plugin name.</param>
+		/// <param name="id">Identifier, unique per namespace.</param>
+		/// <returns>If ToolbarManager is present, a new <see cref="Toolbar.IButton"/> object, <c>null</c> otherwise.</returns>
+		public static ToolbarButtonWrapper TryWrapToolbarButton(string ns, string id)
+		{
+			if (ToolbarManagerPresent)
+			{
+				object button = TBManagerAdd.Invoke(TBManagerInstance, new object[] { ns, id });
+
+				Tools.PostDebugMessage(string.Format(
+					"{0}: Added Button '{1}' with ToolbarManager.  Getting 'Text' property",
+					"ToolbarButtonWrapper",
+					button.ToString()
+				));
+
+				return new ToolbarButtonWrapper(button);
+			}
+			else
+			{
+				return null;
+			}
+		}
+
 		protected System.Type IButton;
 		protected object Button;
 		protected PropertyInfo ButtonText;
@@ -44,6 +137,14 @@
 		protected MethodInfo ButtonDestroy;
 		protected System.Type GameScenesVisibilityType;
 
+		/// <summary>
+		/// The text displayed on the button. Set to null to hide text.
+		/// </summary>
+		/// <remarks>
+		/// The text can be changed at any time to modify the button's appearance. Note that since this will also
+		/// modify the button's size, this feature should be used sparingly, if at all.
+		/// </remarks>
+		/// <seealso cref="TexturePath"/>
 		public string Text
 		{
 			get
@@ -56,6 +157,12 @@
 			}
 		}
 
+		/// <summary>
+		/// The color the button text is displayed with. Defaults to Color.white.
+		/// </summary>
+		/// <remarks>
+		/// The text color can be changed at any time to modify the button's appearance.
+		/// </remarks>
 		public Color TextColor
 		{
 			get
@@ -68,6 +175,26 @@
 			}
 		}
 
+		/// <summary>
+		/// The path of a texture file to display an icon on the button. Set to null to hide icon.
+		/// </summary>
+		/// <remarks>
+		/// <para>
+		/// A texture path on a button will have precedence over text. That is, if both text and texture path
+		/// have been set on a button, the button will show the texture, not the text.
+		/// </para>
+		/// <para>
+		/// The texture size must not exceed 24x24 pixels.
+		/// </para>
+		/// <para>
+		/// The texture path must be relative to the "GameData" directory, and must not specify a file name suffix.
+		/// Valid example: MyAddon/Textures/icon_mybutton
+		/// </para>
+		/// <para>
+		/// The texture path can be changed at any time to modify the button's appearance.
+		/// </para>
+		/// </remarks>
+		/// <seealso cref="Text"/>
 		public string TexturePath
 		{
 			get
@@ -80,6 +207,12 @@
 			}
 		}
 
+		/// <summary>
+		/// The button's tool tip text. Set to null if no tool tip is desired.
+		/// </summary>
+		/// <remarks>
+		/// Tool Tip Text Should Always Use Headline Style Like This.
+		/// </remarks>
 		public string ToolTip
 		{
 			get
@@ -92,6 +225,9 @@
 			}
 		}
 
+		/// <summary>
+		/// Whether this button is currently visible or not. Can be used in addition to or as a replacement for <see cref="Visibility"/>.
+		/// </summary>
 		public bool Visible
 		{
 			get
@@ -104,6 +240,10 @@
 			}
 		}
 
+		/// <summary>
+		/// Whether this button is currently enabled (clickable) or not. This will not affect the player's ability to
+		/// position the button on their screen.
+		/// </summary>
 		public bool Enabled
 		{
 			get
@@ -118,41 +258,14 @@
 
 		private ToolbarButtonWrapper() {}
 
-		public ToolbarButtonWrapper(string ns, string id)
-		{
-			Tools.PostDebugMessage(string.Format(
-				"{0}: Loading ToolbarManager.",
-				this.GetType().Name
-			));
-
-			this.ToolbarManager = AssemblyLoader.loadedAssemblies
-				.Select(a => a.assembly.GetExportedTypes())
-				.SelectMany(t => t)
-				.FirstOrDefault(t => t.FullName == "Toolbar.ToolbarManager");
-
-			Tools.PostDebugMessage(string.Format(
-				"{0}: Loaded ToolbarManager.  Getting Instance.",
-				this.GetType().Name
-				));
-
-			this.TBManagerInstance = this.ToolbarManager.GetProperty(
-					"Instance",
-					System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static
-				)
-				.GetValue(null, null);
-
-			Tools.PostDebugMessage(string.Format(
-				"{0}: Got ToolbarManager Instance '{1}'.  Getting 'add' method.",
-				this.GetType().Name,
-				this.TBManagerInstance
-				));
-
-			this.TBManagerAdd = this.ToolbarManager.GetMethod("add");
-
-			Tools.PostDebugMessage(string.Format(
-				"{0}: Got ToolbarManager Instance 'add' method.  Loading IButton.",
-				this.GetType().Name
-				));
+		/// <summary>
+		/// Initializes a new instance of the <see cref="VOID.ToolbarButtonWrapper"/> class.
+		/// </summary>
+		/// <param name="ns">Namespace, usually the plugin name.</param>
+		/// <param name="id">Identifier, unique per namespace.</param>
+		protected ToolbarButtonWrapper(object button)
+		{
+			this.Button = button;
 
 			this.IButton = AssemblyLoader.loadedAssemblies
 				.Select(a => a.assembly.GetExportedTypes())
@@ -164,14 +277,6 @@
 				this.GetType().Name
 				));
 
-			this.Button = this.TBManagerAdd.Invoke(this.TBManagerInstance, new object[] {ns, id});
-
-			Tools.PostDebugMessage(string.Format(
-				"{0}: Added Button '{1}' with ToolbarManager.  Getting 'Text' property",
-				this.GetType().Name,
-				this.Button.ToString()
-				));
-
 			this.ButtonText = this.IButton.GetProperty("Text");
 
 			Tools.PostDebugMessage(string.Format(
@@ -252,6 +357,21 @@
 			Tools.PostDebugMessage("ToolbarButtonWrapper built!");
 		}
 
+		/// <summary>
+		/// Adds event handler to receive "on click" events.
+		/// </summary>
+		/// <example>
+		/// <code>
+		/// ToolbarButtonWrapper button = ...
+		/// button.AddButtonClickHandler(
+		/// 	(e) =>
+		/// 	{
+		/// 		Debug.Log("button clicked, mouseButton: " + e.Mousebutton");
+		/// 	}
+		/// );
+		/// </code>
+		/// </example>
+		/// <param name="Handler">Delegate to handle "on click" events</param>
 		public void AddButtonClickHandler(Action<object> Handler)
 		{
 			Delegate d = Delegate.CreateDelegate(this.ClickHandlerType, Handler.Target, Handler.Method);
@@ -259,12 +379,20 @@
 			addHandler.Invoke(this.Button, new object[] { d });
 		}
 
+		/// <summary>
+		/// Sets this button's visibility. Can be used in addition to or as a replacement for <see cref="Visible"/>.
+		/// </summary>
+		/// <param name="gameScenes">Array of GameScene objects in which the button should be visible.</param>
 		public void SetButtonVisibility(params GameScenes[] gameScenes)
 		{
 			object GameScenesVisibilityObj = Activator.CreateInstance(this.GameScenesVisibilityType, gameScenes);
 			this.ButtonVisibility.SetValue(this.Button, GameScenesVisibilityObj, null);
 		}
 
+		/// <summary>
+		/// Permanently destroys this button so that it is no longer displayed.
+		/// Should be used when a plugin is stopped to remove leftover buttons.
+		/// </summary>
 		public void Destroy()
 		{
 			this.ButtonDestroy.Invoke(this.Button, null);

--- a/VOID_Core.cs
+++ b/VOID_Core.cs
@@ -68,7 +68,7 @@
 		 * Fields
 		 * */
 		protected string VoidName = "VOID";
-		protected string VoidVersion = "0.9.15";
+		protected string VoidVersion = "0.9.17";
 
 		protected bool _factoryReset = false;
 
@@ -157,7 +157,7 @@
 
 		[AVOID_SaveValue("UseBlizzyToolbar")]
 		protected VOID_SaveValue<bool> _UseToolbarManager;
-		protected bool ToolbarManagerLoaded = false;
+		protected bool ToolbarManagerLoaded;
 		internal ToolbarButtonWrapper ToolbarButton;
 
 		/*
@@ -280,6 +280,7 @@
 			this._skinName = this.defaultSkin;
 
 			this.UseToolbarManager = false;
+			this.ToolbarManagerLoaded = false;
 
 			this.LoadConfig ();
 		}
@@ -445,31 +446,27 @@
 
 		protected void LoadToolbarManager()
 		{
-			Type ToolbarManager = AssemblyLoader.loadedAssemblies
-				.Select(a => a.assembly.GetExportedTypes())
-					.SelectMany(t => t)
-					.FirstOrDefault(t => t.FullName == "Toolbar.ToolbarManager");
-
-			if (ToolbarManager == null)
-			{
-				Tools.PostDebugMessage(string.Format(
-					"{0}: Could not load ToolbarManager.",
-					this.GetType().Name
-				));
-
-				return;
-			}
-
-			this.InitializeToolbarButton();
-
-			this.ToolbarManagerLoaded = true;
+			this.ToolbarManagerLoaded = ToolbarButtonWrapper.ToolbarManagerPresent;
+
+			if (this.ToolbarManagerLoaded)
+			{
+				this.InitializeToolbarButton();
+			}
 		}
 
 		protected void InitializeToolbarButton()
 		{
-			this.ToolbarButton = new ToolbarButtonWrapper(this.GetType().Name, "coreToggle");
+			this.ToolbarButton = ToolbarButtonWrapper.TryWrapToolbarButton(this.GetType().Name, "coreToggle");
 			this.ToolbarButton.Text = this.VoidName;
 			this.ToolbarButton.TexturePath = this.VOIDIconOffPath + "_24x24";
+			if (this is VOID_EditorCore)
+			{
+				this.ToolbarButton.SetButtonVisibility(new GameScenes[] { GameScenes.EDITOR });
+			}
+			else
+			{
+				this.ToolbarButton.SetButtonVisibility(new GameScenes[] { GameScenes.FLIGHT });
+			}
 			this.ToolbarButton.AddButtonClickHandler(
 				(e) => this.mainGuiMinimized = !this.mainGuiMinimized
 			);