3 namespace Consolidation\AnnotatedCommand\Hooks\Dispatchers;
5 use Consolidation\AnnotatedCommand\CommandData;
6 use Consolidation\AnnotatedCommand\Hooks\HookManager;
7 use Psr\Log\LoggerAwareInterface;
8 use Psr\Log\LoggerAwareTrait;
13 class ReplaceCommandHookDispatcher extends HookDispatcher implements LoggerAwareInterface
21 public function hasReplaceCommandHook()
23 return (bool) count($this->getReplaceCommandHooks());
29 public function getReplaceCommandHooks()
32 HookManager::REPLACE_COMMAND_HOOK,
34 $replaceCommandHooks = $this->getHooks($hooks);
36 return $replaceCommandHooks;
40 * @param \Consolidation\AnnotatedCommand\CommandData $commandData
44 public function getReplacementCommand(CommandData $commandData)
46 $replaceCommandHooks = $this->getReplaceCommandHooks();
48 // We only take the first hook implementation of "replace-command" as the replacement. Commands shouldn't have
49 // more than one replacement.
50 $replacementCommand = reset($replaceCommandHooks);
52 if ($this->logger && count($replaceCommandHooks) > 1) {
53 $command_name = $commandData->annotationData()->get('command', 'unknown');
54 $message = "Multiple implementations of the \"replace - command\" hook exist for the \"$command_name\" command.\n";
55 foreach ($replaceCommandHooks as $replaceCommandHook) {
56 $class = get_class($replaceCommandHook[0]);
57 $method = $replaceCommandHook[1];
58 $hook_name = "$class->$method";
59 $message .= " - $hook_name\n";
61 $this->logger->warning($message);
64 return $replacementCommand;