Security update for permissions_by_term
[yaffs-website] / vendor / behat / behat / src / Behat / Testwork / Call / CallCenter.php
diff --git a/vendor/behat/behat/src/Behat/Testwork/Call/CallCenter.php b/vendor/behat/behat/src/Behat/Testwork/Call/CallCenter.php
new file mode 100644 (file)
index 0000000..448367b
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+
+/*
+ * This file is part of the Behat Testwork.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Testwork\Call;
+
+use Behat\Testwork\Call\Exception\CallHandlingException;
+use Behat\Testwork\Call\Exception\FatalThrowableError;
+use Behat\Testwork\Call\Filter\CallFilter;
+use Behat\Testwork\Call\Filter\ResultFilter;
+use Behat\Testwork\Call\Handler\CallHandler;
+use Behat\Testwork\Call\Handler\ExceptionHandler;
+use Exception;
+use Throwable;
+
+/**
+ * Makes calls and handles results using registered handlers.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+final class CallCenter
+{
+    /**
+     * @var CallFilter[]
+     */
+    private $callFilters = array();
+    /**
+     * @var CallHandler[]
+     */
+    private $callHandlers = array();
+    /**
+     * @var ResultFilter[]
+     */
+    private $resultFilters = array();
+    /**
+     * @var ExceptionHandler[]
+     */
+    private $exceptionHandlers = array();
+
+    /**
+     * Registers call filter.
+     *
+     * @param CallFilter $filter
+     */
+    public function registerCallFilter(CallFilter $filter)
+    {
+        $this->callFilters[] = $filter;
+    }
+
+    /**
+     * Registers call handler.
+     *
+     * @param CallHandler $handler
+     */
+    public function registerCallHandler(CallHandler $handler)
+    {
+        $this->callHandlers[] = $handler;
+    }
+
+    /**
+     * Registers call result filter.
+     *
+     * @param ResultFilter $filter
+     */
+    public function registerResultFilter(ResultFilter $filter)
+    {
+        $this->resultFilters[] = $filter;
+    }
+
+    /**
+     * Registers result exception handler.
+     *
+     * @param ExceptionHandler $handler
+     */
+    public function registerExceptionHandler(ExceptionHandler $handler)
+    {
+        $this->exceptionHandlers[] = $handler;
+    }
+
+    /**
+     * Handles call and its result using registered filters and handlers.
+     *
+     * @param Call $call
+     *
+     * @return CallResult
+     */
+    public function makeCall(Call $call)
+    {
+        try {
+            return $this->filterResult($this->handleCall($this->filterCall($call)));
+        } catch (Exception $exception) {
+            return new CallResult($call, null, $this->handleException($exception), null);
+        } catch (Throwable $exception) {
+            return new CallResult($call, null, $this->handleException($exception), null);
+        }
+    }
+
+    /**
+     * Filters call using registered filters and returns a filtered one.
+     *
+     * @param Call $call
+     *
+     * @return Call
+     */
+    private function filterCall(Call $call)
+    {
+        foreach ($this->callFilters as $filter) {
+            if (!$filter->supportsCall($call)) {
+                continue;
+            }
+
+            $call = $filter->filterCall($call);
+        }
+
+        return $call;
+    }
+
+    /**
+     * Handles call using registered call handlers.
+     *
+     * @param Call $call
+     *
+     * @return CallResult
+     *
+     * @throws CallHandlingException If call handlers didn't produce call result
+     */
+    private function handleCall(Call $call)
+    {
+        foreach ($this->callHandlers as $handler) {
+            if (!$handler->supportsCall($call)) {
+                continue;
+            }
+
+            return $handler->handleCall($call);
+        }
+
+        throw new CallHandlingException(sprintf(
+            'None of the registered call handlers could handle a `%s` call.',
+            $call->getCallee()->getPath()
+        ), $call);
+    }
+
+    /**
+     * Filters call result using registered filters and returns a filtered one.
+     *
+     * @param CallResult $result
+     *
+     * @return CallResult
+     */
+    private function filterResult(CallResult $result)
+    {
+        foreach ($this->resultFilters as $filter) {
+            if (!$filter->supportsResult($result)) {
+                continue;
+            }
+
+            $result = $filter->filterResult($result);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Handles exception using registered handlers and returns a handled one.
+     *
+     * @param Throwable $exception
+     *
+     * @return Throwable
+     */
+    private function handleException($exception)
+    {
+        foreach ($this->exceptionHandlers as $handler) {
+            if (!$handler->supportsException($exception)) {
+                continue;
+            }
+
+            $exception = $handler->handleException($exception);
+        }
+
+        if ($exception instanceof Throwable) {
+            return new FatalThrowableError($exception);
+        }
+
+        return $exception;
+    }
+}