4 * This file is part of the Behat.
5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
11 namespace Behat\Behat\Transformation\ServiceContainer;
13 use Behat\Behat\Context\ServiceContainer\ContextExtension;
14 use Behat\Behat\Definition\ServiceContainer\DefinitionExtension;
15 use Behat\Testwork\Call\ServiceContainer\CallExtension;
16 use Behat\Testwork\Environment\ServiceContainer\EnvironmentExtension;
17 use Behat\Testwork\ServiceContainer\Extension;
18 use Behat\Testwork\ServiceContainer\ExtensionManager;
19 use Behat\Testwork\ServiceContainer\ServiceProcessor;
20 use Behat\Testwork\Translator\ServiceContainer\TranslatorExtension;
21 use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
22 use Symfony\Component\DependencyInjection\ContainerBuilder;
23 use Symfony\Component\DependencyInjection\Definition;
24 use Symfony\Component\DependencyInjection\Reference;
27 * Provides definition arguments transformation functionality.
29 * @author Konstantin Kudryashov <ever.zet@gmail.com>
31 class TransformationExtension implements Extension
36 const REPOSITORY_ID = 'transformation.repository';
39 * Available extension points
41 const ARGUMENT_TRANSFORMER_TAG = 'transformation.argument_transformer';
44 * @var ServiceProcessor
49 * Initializes extension.
51 * @param null|ServiceProcessor $processor
53 public function __construct(ServiceProcessor $processor = null)
55 $this->processor = $processor ?: new ServiceProcessor();
61 public function getConfigKey()
63 return 'transformations';
69 public function initialize(ExtensionManager $extensionManager)
76 public function configure(ArrayNodeDefinition $builder)
83 public function load(ContainerBuilder $container, array $config)
85 $this->loadDefinitionArgumentsTransformer($container);
86 $this->loadDefaultTransformers($container);
87 $this->loadAnnotationReader($container);
88 $this->loadRepository($container);
94 public function process(ContainerBuilder $container)
96 $this->processArgumentsTransformers($container);
100 * Loads definition arguments transformer.
102 * @param ContainerBuilder $container
104 protected function loadDefinitionArgumentsTransformer(ContainerBuilder $container)
106 $definition = new Definition('Behat\Behat\Transformation\Call\Filter\DefinitionArgumentsTransformer');
107 $definition->addTag(CallExtension::CALL_FILTER_TAG, array('priority' => 200));
108 $container->setDefinition($this->getDefinitionArgumentTransformerId(), $definition);
112 * Loads default transformers.
114 * @param ContainerBuilder $container
116 protected function loadDefaultTransformers(ContainerBuilder $container)
118 $definition = new Definition('Behat\Behat\Transformation\Transformer\RepositoryArgumentTransformer', array(
119 new Reference(self::REPOSITORY_ID),
120 new Reference(CallExtension::CALL_CENTER_ID),
121 new Reference(DefinitionExtension::PATTERN_TRANSFORMER_ID),
122 new Reference(TranslatorExtension::TRANSLATOR_ID)
124 $definition->addTag(self::ARGUMENT_TRANSFORMER_TAG, array('priority' => 50));
125 $container->setDefinition(self::ARGUMENT_TRANSFORMER_TAG . '.repository', $definition);
129 * Loads transformation context annotation reader.
131 * @param ContainerBuilder $container
133 protected function loadAnnotationReader(ContainerBuilder $container)
135 $definition = new Definition('Behat\Behat\Transformation\Context\Annotation\TransformationAnnotationReader');
136 $definition->addTag(ContextExtension::ANNOTATION_READER_TAG, array('priority' => 50));
137 $container->setDefinition(ContextExtension::ANNOTATION_READER_TAG . '.transformation', $definition);
141 * Loads transformations repository.
143 * @param ContainerBuilder $container
145 protected function loadRepository(ContainerBuilder $container)
147 $definition = new Definition('Behat\Behat\Transformation\TransformationRepository', array(
148 new Reference(EnvironmentExtension::MANAGER_ID)
150 $container->setDefinition(self::REPOSITORY_ID, $definition);
154 * Processes all available argument transformers.
156 * @param ContainerBuilder $container
158 protected function processArgumentsTransformers(ContainerBuilder $container)
160 $references = $this->processor->findAndSortTaggedServices($container, self::ARGUMENT_TRANSFORMER_TAG);
161 $definition = $container->getDefinition($this->getDefinitionArgumentTransformerId());
163 foreach ($references as $reference) {
164 $definition->addMethodCall('registerArgumentTransformer', array($reference));
169 * Returns definition argument transformer service id.
173 protected function getDefinitionArgumentTransformerId()
175 return CallExtension::CALL_FILTER_TAG . '.definition_argument_transformer';