public void SetMode(int newMode, bool wrapAroundOutOfRange = false)
        {
#if !ALE_STRIP_SAFETY
            if (editorModes.Length == 0)
            {
                throw new MissingReferenceException($"There are no editor modes attached on {gameObject.name}.");
            }
#endif

            if (newMode < 0)
            {
                if (wrapAroundOutOfRange)
                {
                    newMode = editorModes.Length - 1;
                }
#if !ALE_STRIP_SAFETY
                else
                {
                    throw new ArgumentOutOfRangeException(nameof(newMode), $"{nameof(newMode)} must be between 0 and {editorModes.Length - 1}.");
                }
#endif
            }
            else if (newMode >= editorModes.Length)
            {
                if (wrapAroundOutOfRange)
                {
                    newMode = 0;
                }
#if !ALE_STRIP_SAFETY
                else
                {
                    throw new ArgumentOutOfRangeException(nameof(newMode), $"{nameof(newMode)} must be between 0 and {editorModes.Length - 1}.");
                }
#endif
            }

            if (selectedMode == newMode)
            {
                return;
            }

            ILevelEditorMode previousMode = null;

            if (selectedMode >= 0)
            {
                previousMode = editorModes[selectedMode];
                editorModes[selectedMode].OnModeDisable();
            }

            selectedMode = newMode;
            editorModes[selectedMode].OnModeEnable();

            OnEditorModeChanged?.Invoke(this, new EditorModeChangeEventArgs(previousMode, editorModes[selectedMode]));
        }
 public EditorModeChangeEventArgs(ILevelEditorMode previousMode, ILevelEditorMode newMode)
 {
     PreviousMode = previousMode;
     NewMode      = newMode;
 }