public bool Run(string[] args)
        {
            if (args.Length < 1)
            {
                PrintUsage();
                return(false);
            }

            Command command;

            if (!_commands.TryGetValue(args[0], out command))
            {
                _output.WriteLine("Unknown command '{0}'", args[0]);
                return(false);
            }

            try
            {
                command.Proc(args.Skip(1).ToArray());
                switch (command.Type)
                {
                case CommandType.Task:
                    ListNotDoneTasks();
                    if (_repoManager.HasRepository(_taskManager.RepositoryName))
                    {
                        Repository repository = _repoManager.GetRepository(_taskManager.RepositoryName);
                        TaskStore.SaveTaskManager(repository, _taskManager);
                    }
                    break;

                case CommandType.Repository:
                    PrintRepositories();
                    TaskStore.SaveRepositoryManager(_repoManager);
                    break;

                case CommandType.State:
                    ListStates();
                    TaskStore.SaveStateManager(_stateManager);
                    break;
                }
                return(true);
            }
            catch (Exception ex)
            {
                _output.WriteLine("Error: {0}", ex.Message);
                _output.WriteLine("Usage: <tw> {1} {2}", _ident, command.Name, command.UsageArgs);
                return(false);
            }
        }