--- /dev/null
+<?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\Environment;
+
+use Behat\Behat\Context\Environment\Handler\ContextEnvironmentHandler;
+use Behat\Behat\Context\Exception\ContextNotFoundException;
+use Behat\Behat\Context\Exception\WrongContextClassException;
+use Behat\Testwork\Environment\StaticEnvironment;
+
+/**
+ * Context environment based on a list of context classes.
+ *
+ * @see ContextEnvironmentHandler
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+final class UninitializedContextEnvironment extends StaticEnvironment implements ContextEnvironment
+{
+ /**
+ * @var array[]
+ */
+ private $contextClasses = array();
+
+ /**
+ * Registers context class.
+ *
+ * @param string $contextClass
+ * @param null|array $arguments
+ *
+ * @throws ContextNotFoundException If class does not exist
+ * @throws WrongContextClassException if class does not implement Context interface
+ */
+ public function registerContextClass($contextClass, array $arguments = null)
+ {
+ if (!class_exists($contextClass)) {
+ throw new ContextNotFoundException(sprintf(
+ '`%s` context class not found and can not be used.',
+ $contextClass
+ ), $contextClass);
+ }
+
+ $reflClass = new \ReflectionClass($contextClass);
+
+ if (!$reflClass->implementsInterface('Behat\Behat\Context\Context')) {
+ throw new WrongContextClassException(sprintf(
+ 'Every context class must implement Behat Context interface, but `%s` does not.',
+ $contextClass
+ ), $contextClass);
+ }
+
+ $this->contextClasses[$contextClass] = $arguments ? : array();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function hasContexts()
+ {
+ return count($this->contextClasses) > 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContextClasses()
+ {
+ return array_keys($this->contextClasses);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function hasContextClass($class)
+ {
+ return isset($this->contextClasses[$class]);
+ }
+
+ /**
+ * Returns context classes with their arguments.
+ *
+ * @return array[]
+ */
+ public function getContextClassesWithArguments()
+ {
+ return $this->contextClasses;
+ }
+}