Security update for permissions_by_term
[yaffs-website] / vendor / behat / behat / src / Behat / Behat / Context / ContextFactory.php
diff --git a/vendor/behat/behat/src/Behat/Behat/Context/ContextFactory.php b/vendor/behat/behat/src/Behat/Behat/Context/ContextFactory.php
new file mode 100644 (file)
index 0000000..b7a2442
--- /dev/null
@@ -0,0 +1,150 @@
+<?php
+
+/*
+ * This file is part of the Behat.
+ * (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\Behat\Context;
+
+use Behat\Testwork\Argument\Validator;
+use Behat\Behat\Context\Argument\ArgumentResolver;
+use Behat\Behat\Context\Initializer\ContextInitializer;
+use Behat\Testwork\Argument\ArgumentOrganiser;
+use ReflectionClass;
+
+/**
+ * Instantiates contexts using registered argument resolvers and context initializers.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+final class ContextFactory
+{
+    /**
+     * @var ArgumentOrganiser
+     */
+    private $argumentOrganiser;
+    /**
+     * @var ArgumentResolver[]
+     */
+    private $argumentResolvers = array();
+    /**
+     * @var ContextInitializer[]
+     */
+    private $contextInitializers = array();
+    /**
+     * @var Validator
+     */
+    private $validator;
+
+    /**
+     * Initialises factory.
+     *
+     * @param ArgumentOrganiser $argumentOrganiser
+     */
+    public function __construct(ArgumentOrganiser $argumentOrganiser)
+    {
+        $this->argumentOrganiser = $argumentOrganiser;
+        $this->validator = new Validator();
+    }
+
+    /**
+     * Registers context argument resolver.
+     *
+     * @param ArgumentResolver $resolver
+     */
+    public function registerArgumentResolver(ArgumentResolver $resolver)
+    {
+        $this->argumentResolvers[] = $resolver;
+    }
+
+    /**
+     * Registers context initializer.
+     *
+     * @param ContextInitializer $initializer
+     */
+    public function registerContextInitializer(ContextInitializer $initializer)
+    {
+        $this->contextInitializers[] = $initializer;
+    }
+
+    /**
+     * Creates and initializes context class.
+     *
+     * @param string             $class
+     * @param array              $arguments
+     * @param ArgumentResolver[] $singleUseResolvers
+     *
+     * @return Context
+     */
+    public function createContext($class, array $arguments = array(), array $singleUseResolvers = array())
+    {
+        $reflection = new ReflectionClass($class);
+        $resolvers = array_merge($singleUseResolvers, $this->argumentResolvers);
+        $resolvedArguments = $this->resolveArguments($reflection, $arguments, $resolvers);
+        $context = $this->createInstance($reflection, $resolvedArguments);
+        $this->initializeInstance($context);
+
+        return $context;
+    }
+
+    /**
+     * Resolves arguments for a specific class using registered argument resolvers.
+     *
+     * @param ReflectionClass    $reflection
+     * @param array              $arguments
+     * @param ArgumentResolver[] $resolvers
+     *
+     * @return mixed[]
+     */
+    private function resolveArguments(ReflectionClass $reflection, array $arguments, array $resolvers)
+    {
+        $newArguments = $arguments;
+
+        foreach ($resolvers as $resolver) {
+            $newArguments = $resolver->resolveArguments($reflection, $newArguments);
+        }
+
+        if (!$reflection->hasMethod('__construct')) {
+            return $newArguments;
+        }
+
+        $constructor = $reflection->getConstructor();
+        $newArguments = $this->argumentOrganiser->organiseArguments($constructor, $newArguments);
+        $this->validator->validateArguments($constructor, $newArguments);
+
+        return $newArguments;
+    }
+
+    /**
+     * Creates context instance.
+     *
+     * @param ReflectionClass $reflection
+     * @param array           $arguments
+     *
+     * @return mixed
+     */
+    private function createInstance(ReflectionClass $reflection, array $arguments)
+    {
+        if (count($arguments)) {
+            return $reflection->newInstanceArgs($arguments);
+        }
+
+        return $reflection->newInstance();
+    }
+
+    /**
+     * Initializes context class and returns new context instance.
+     *
+     * @param Context $context
+     */
+    private function initializeInstance(Context $context)
+    {
+        foreach ($this->contextInitializers as $initializer) {
+            $initializer->initializeContext($context);
+        }
+    }
+}