/// <summary>
        /// This method exists to validate documentation for cases where config happens external to AppRunner.Run
        /// </summary>
        public static (int exitCode, string output) InvokeMainMethod(this Type type, string args)
        {
            string[] argsArray  = new CommandLineStringSplitter().SplitToArray(args);
            var      mainMethod = type.GetMethod("Main", BindingFlags.Static | BindingFlags.NonPublic);

            Assert.IsNotNull(mainMethod);

            return(CaptureConsoleWrites(() => (int)mainMethod !.Invoke(null, new object[] { argsArray }) !));
        }
        public void Start()
        {
            var console           = _context.Console;
            var cancellationToken = _context.CancellationToken;

            bool pressedCtrlC = false;

            Console.CancelKeyPress += (sender, args) =>
            {
                pressedCtrlC = true;
            };

            PrintSessionInit();

            bool pendingNewLine = false;

            void Write(string?value = null)
            {
                console !.Write(value);
                pendingNewLine = true;
            }

            void WriteLine(string?value = null)
            {
                console !.WriteLine(value);
                pendingNewLine = false;
            }

            void EnsureNewLine()
            {
                if (pendingNewLine)
                {
                    WriteLine();
                }
            }

            while (!cancellationToken.IsCancellationRequested)
            {
                EnsureNewLine();
                Write(">>>");
                var input = console.In.ReadLine();
                if (input is null || pressedCtrlC)
                {
                    pressedCtrlC = false;
                    WriteLine();
                    return;
                }

                var args = new CommandLineStringSplitter().Split(input).ToArray();
                if (args.Length == 0)
                {
                    WriteLine();
                    continue;
                }
                if (args.Length == 1)
                {
                    var singleArg = args[0];
                    switch (singleArg)
                    {
                    case "exit":
                    case "quit":
                        return;

                    case "help":
                        PrintSessionHelp();
                        continue;
                    }
                    if (singleArg == Environment.NewLine)
                    {
                        WriteLine();
                        continue;
                    }
                }
                EnsureNewLine();
                _appRunner.Run(args);
            }
            EnsureNewLine();
        }