/// <summary>
        /// The entry point for the command line application.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        protected virtual int ExecuteCommandInternal(string[] args)
        {
            try {
                Console.CursorVisible = false;
                ConfigureApp();
                return(Execute(args));
            } catch (Exception ex) {
                ConsoleLogger.LogTheshold = ConsoleLogThreshold.Debug;

                if (ex is CommandParsingException)
                {
                    ConsoleLogger.Error(ex.Message);
                    if (ex is UnrecognizedCommandParsingException unrecognizedCommandParsingException && unrecognizedCommandParsingException.NearestMatches.Any())
                    {
                        ConsoleLogger.Info($"Did you mean {unrecognizedCommandParsingException.NearestMatches.First()}?");
                    }
                    ConsoleLogger.Info($"Specify --{AExecutionCommand.HelpLongName} for a list of available options and commands.");
                }
                else
                {
                    ConsoleLogger.Error(ex.Message, ex);
                }

                ConsoleLogger.Fatal($"Exit code {AExecutionCommand.FatalExitCode}");
                ConsoleLogger.WriteOnNewLine(null);
                return(AExecutionCommand.FatalExitCode);
            } finally {
                Console.CursorVisible = true;
            }
        }