* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Behat\Testwork\Call; use Behat\Testwork\Call\Exception\BadCallbackException; use ReflectionFunction; use ReflectionFunctionAbstract; use ReflectionMethod; /** * Represents callee created and executed in the runtime. * * @author Konstantin Kudryashov */ class RuntimeCallee implements Callee { /** * @var callable */ private $callable; /** * @var null|string */ private $description; /** * @var ReflectionFunctionAbstract */ private $reflection; /** * @var string */ private $path; /** * Initializes callee. * * @param callable $callable * @param null|string $description * * @throws BadCallbackException If invalid callback provided */ public function __construct($callable, $description = null) { if (!is_array($callable) && !is_callable($callable)) { throw new BadCallbackException(sprintf( '%s expects a valid callable, but `%s` given', get_class($this), gettype($callable) ), $callable); } if (is_array($callable)) { $this->reflection = new ReflectionMethod($callable[0], $callable[1]); $this->path = $callable[0] . '::' . $callable[1] . '()'; } else { $this->reflection = new ReflectionFunction($callable); $this->path = $this->reflection->getFileName() . ':' . $this->reflection->getStartLine(); } $this->callable = $callable; $this->description = $description; } /** * Returns callee description. * * @return string */ public function getDescription() { return $this->description; } /** * Returns callee definition path. * * @return string */ public function getPath() { return $this->path; } /** * Returns callable. * * @return callable */ public function getCallable() { return $this->callable; } /** * Returns callable reflection. * * @return ReflectionFunctionAbstract */ public function getReflection() { return $this->reflection; } /** * Returns true if callee is a method, false otherwise. * * @return Boolean */ public function isAMethod() { return $this->reflection instanceof ReflectionMethod; } /** * Returns true if callee is an instance (non-static) method, false otherwise. * * @return Boolean */ public function isAnInstanceMethod() { return $this->reflection instanceof ReflectionMethod && !$this->reflection->isStatic(); } }