protected override void Register(IDependancyContainer dependancyContainer)
		{
			dependancyContainer.Register<ICommandWithArguments<HelpCommandArguments>, HelpCommand>();
			dependancyContainer.Register<ICommandWithArguments<RawExportCommandArguments>, RawExportCommand>();
			dependancyContainer.Register<ICommandWithArguments<SetCredentialsCommandArguments>, SetCredentialsCommand>();

			dependancyContainer.Register<IMixPanelClient, MixPanelClient>();
			dependancyContainer.Register<IFileWriter, FileWriter>();
			dependancyContainer.Register<IWebClient, DefaultWebClient>();
			dependancyContainer.RegisterInstance(new ClientConfiguration());
		}
		public IConsoleApplication Create(ICommandConfigurationRegistry commandConfigurationRegistry,
		                                  IDependancyContainer dependancyContainer,
		                                  ApplicationConfiguration applicationConfiguration)
		{
			var commandParser = new CommandParser(commandConfigurationRegistry,
			                                      new CommandFactory(dependancyContainer),
			                                      new CommandArgumentParser(
				                                      applicationConfiguration.ValueBinderProviderCollection));
			var resultHandler = new ResultHandler(new ConsoleOutput());
			var consoleInput = new ConsoleInput();
			var exceptionHandler = new ExceptionHandler(applicationConfiguration.ExceptionHandlerConfigurationsCollection);

			return new ConsoleApplication(commandParser, resultHandler, consoleInput, exceptionHandler);
		}
		private void RegisterDependancies(IDependancyContainer dependancyContainer)
		{
			foreach (var dependancyInjectionConfiguration in _userDefinedDependancyConfigurations)
			{
				dependancyInjectionConfiguration.RegisterInternal(dependancyContainer);
			}
		}
		private void RegisterConfigurationRegistryDependancy(IDependancyContainer dependancyContainer)
		{
			dependancyContainer.RegisterInstance(_commandConfigurationRegistry);
		}
		public CommandFactory(IDependancyContainer dependancyContainer)
		{
			_dependancyContainer = dependancyContainer;
		}
		protected abstract void Register(IDependancyContainer dependancyContainer);
		internal void RegisterInternal(IDependancyContainer dependancyContainer)
		{
			Register(dependancyContainer);
		}
			protected override void Register(IDependancyContainer dependancyContainer)
			{
				TimesCalled += 1;
				LastCaller = dependancyContainer;
			}
		protected override void Register(IDependancyContainer dependancyContainer)
		{
			dependancyContainer.Register<IOutput, ConsoleOutput>();
		}