--- /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\Definition\Pattern;
+
+use Behat\Behat\Definition\Exception\UnknownPatternException;
+use Behat\Behat\Definition\Exception\UnsupportedPatternTypeException;
+use Behat\Behat\Definition\Pattern\Policy\PatternPolicy;
+
+/**
+ * Transforms patterns using registered policies.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+final class PatternTransformer
+{
+ /**
+ * @var PatternPolicy[]
+ */
+ private $policies = array();
+
+ /**
+ * Registers pattern policy.
+ *
+ * @param PatternPolicy $policy
+ */
+ public function registerPatternPolicy(PatternPolicy $policy)
+ {
+ $this->policies[] = $policy;
+ }
+
+ /**
+ * Generates pattern.
+ *
+ * @param string $type
+ * @param string $stepText
+ *
+ * @return Pattern
+ *
+ * @throws UnsupportedPatternTypeException
+ */
+ public function generatePattern($type, $stepText)
+ {
+ foreach ($this->policies as $policy) {
+ if ($policy->supportsPatternType($type)) {
+ return $policy->generatePattern($stepText);
+ }
+ }
+
+ throw new UnsupportedPatternTypeException(sprintf('Can not find policy for a pattern type `%s`.', $type), $type);
+ }
+
+ /**
+ * Transforms pattern string to regex.
+ *
+ * @param string $pattern
+ *
+ * @return string
+ *
+ * @throws UnknownPatternException
+ */
+ public function transformPatternToRegex($pattern)
+ {
+ foreach ($this->policies as $policy) {
+ if ($policy->supportsPattern($pattern)) {
+ return $policy->transformPatternToRegex($pattern);
+ }
+ }
+
+ throw new UnknownPatternException(sprintf('Can not find policy for a pattern `%s`.', $pattern), $pattern);
+ }
+}