--- /dev/null
+<?php
+
+namespace Consolidation\AnnotatedCommand\Hooks\Dispatchers;
+
+use Consolidation\AnnotatedCommand\ExitCodeInterface;
+use Consolidation\AnnotatedCommand\Hooks\HookManager;
+use Consolidation\AnnotatedCommand\Hooks\StatusDeterminerInterface;
+
+/**
+ * Call hooks
+ */
+class StatusDeterminerHookDispatcher extends HookDispatcher implements StatusDeterminerInterface
+{
+ /**
+ * Call all status determiners, and see if any of them
+ * know how to convert to a status code.
+ */
+ public function determineStatusCode($result)
+ {
+ // If the result (post-processing) is an object that
+ // implements ExitCodeInterface, then we will ask it
+ // to give us the status code.
+ if ($result instanceof ExitCodeInterface) {
+ return $result->getExitCode();
+ }
+
+ $hooks = [
+ HookManager::STATUS_DETERMINER,
+ ];
+ // If the result does not implement ExitCodeInterface,
+ // then we'll see if there is a determiner that can
+ // extract a status code from the result.
+ $determiners = $this->getHooks($hooks);
+ foreach ($determiners as $determiner) {
+ $status = $this->callDeterminer($determiner, $result);
+ if (isset($status)) {
+ return $status;
+ }
+ }
+ }
+
+ protected function callDeterminer($determiner, $result)
+ {
+ if ($determiner instanceof StatusDeterminerInterface) {
+ return $determiner->determineStatusCode($result);
+ }
+ if (is_callable($determiner)) {
+ return $determiner($result);
+ }
+ }
+}