setName('help')
            ->setAliases(['?'])
            ->setDefinition([
                new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name.', null),
            ])
            ->setDescription('Show a list of commands. Type `help [foo]` for information about [foo].')
            ->setHelp('My. How meta.');
    }
    /**
     * Helper for setting a subcommand to retrieve help for.
     *
     * @param Command $command
     */
    public function setCommand(Command $command)
    {
        $this->command = $command;
    }
    /**
     * {@inheritdoc}
     *
     * @return int 0 if everything went fine, or an exit code
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if ($this->command !== null) {
            // help for an individual command
            $output->page($this->command->asText());
            $this->command = null;
        } elseif ($name = $input->getArgument('command_name')) {
            // help for an individual command
            $output->page($this->getApplication()->get($name)->asText());
        } else {
            // list available commands
            $commands = $this->getApplication()->all();
            $table = $this->getTable($output);
            foreach ($commands as $name => $command) {
                if ($name !== $command->getName()) {
                    continue;
                }
                if ($command->getAliases()) {
                    $aliases = \sprintf('Aliases: %s', \implode(', ', $command->getAliases()));
                } else {
                    $aliases = '';
                }
                $table->addRow([
                    \sprintf('%s', $name),
                    $command->getDescription(),
                    $aliases,
                ]);
            }
            if ($output instanceof ShellOutput) {
                $output->startPaging();
            }
            if ($table instanceof TableHelper) {
                $table->render($output);
            } else {
                $table->render();
            }
            if ($output instanceof ShellOutput) {
                $output->stopPaging();
            }
        }
        return 0;
    }
}