public TWindow Create <TWindow, TViewModel>()
            where TWindow : IWindow, new()
        {
            var window = new TWindow()
            {
                DataContext = _compositionContainer.GetExportedValue <TViewModel>()
            };

            return(window);
        }
        public void OnImportsSatisfied()
        {
            NativeMethods.CreateConsole();

            var lexicon      = _compositionContainer.GetExportedValue <ILexicon>();
            var lexer        = _compositionContainer.GetExportedValue <ILexer>();
            var languageSpec = _compositionContainer.GetExportedValue <ILanguageSpecification>();
            var tokenizer    = _compositionContainer.GetExportedValue <ITokenizer>();

            Console.Clear();
            Console.Write("What now? ");
            var userInput = Console.ReadLine();

            while (!string.IsNullOrWhiteSpace(userInput))
            {
                var tokens  = tokenizer.Tokenize(lexicon, userInput);
                var phrases = lexer.Parse(tokens);

                bool isValid = true;

                phrases.Action(phrase => isValid &= languageSpec.IsValidPhrase(phrase));

                if (!isValid)
                {
                    Console.WriteLine($"I don't know what you mean by '{userInput}'");
                }
                else
                {
                    // TODO: Convert each phrase to an action
                    //       Run each item, if one fails STOP execution
                    //action?.Run();
                }

                Console.Write("What now? ");
                userInput = Console.ReadLine();
            }
        }