* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Behat\Behat\Hook\Context\Annotation; use Behat\Behat\Context\Annotation\AnnotationReader; use Behat\Testwork\Hook\Call\RuntimeHook; use ReflectionMethod; /** * Reads hook callees from context method annotations. * * @author Konstantin Kudryashov */ final class HookAnnotationReader implements AnnotationReader { /** * @var string */ private static $regex = '/^\@(beforesuite|aftersuite|beforefeature|afterfeature|beforescenario|afterscenario|beforestep|afterstep)(?:\s+(.+))?$/i'; /** * @var string[] */ private static $classes = array( 'beforesuite' => 'Behat\Testwork\Hook\Call\BeforeSuite', 'aftersuite' => 'Behat\Testwork\Hook\Call\AfterSuite', 'beforefeature' => 'Behat\Behat\Hook\Call\BeforeFeature', 'afterfeature' => 'Behat\Behat\Hook\Call\AfterFeature', 'beforescenario' => 'Behat\Behat\Hook\Call\BeforeScenario', 'afterscenario' => 'Behat\Behat\Hook\Call\AfterScenario', 'beforestep' => 'Behat\Behat\Hook\Call\BeforeStep', 'afterstep' => 'Behat\Behat\Hook\Call\AfterStep' ); /** * Loads step callees (if exist) associated with specific method. * * @param string $contextClass * @param ReflectionMethod $method * @param string $docLine * @param string $description * * @return null|RuntimeHook */ public function readCallee($contextClass, ReflectionMethod $method, $docLine, $description) { if (!preg_match(self::$regex, $docLine, $match)) { return null; } $type = strtolower($match[1]); $class = self::$classes[$type]; $pattern = isset($match[2]) ? $match[2] : null; $callable = array($contextClass, $method->getName()); return new $class($pattern, $callable, $description); } }