You are here

public function ProphecySubjectPatch::apply in Zircon Profile 8.0

Same name and namespace in other branches
  1. 8 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php \Prophecy\Doubler\ClassPatch\ProphecySubjectPatch::apply()

Apply Prophecy functionality to class node.

Parameters

ClassNode $node:

Overrides ClassPatchInterface::apply

File

vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php, line 43

Class

ProphecySubjectPatch
Add Prophecy functionality to the double. This is a core class patch for Prophecy.

Namespace

Prophecy\Doubler\ClassPatch

Code

public function apply(ClassNode $node) {
  $node
    ->addInterface('Prophecy\\Prophecy\\ProphecySubjectInterface');
  $node
    ->addProperty('objectProphecy', 'private');
  foreach ($node
    ->getMethods() as $name => $method) {
    if ('__construct' === strtolower($name)) {
      continue;
    }
    $method
      ->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());');
  }
  $prophecySetter = new MethodNode('setProphecy');
  $prophecyArgument = new ArgumentNode('prophecy');
  $prophecyArgument
    ->setTypeHint('Prophecy\\Prophecy\\ProphecyInterface');
  $prophecySetter
    ->addArgument($prophecyArgument);
  $prophecySetter
    ->setCode('$this->objectProphecy = $prophecy;');
  $prophecyGetter = new MethodNode('getProphecy');
  $prophecyGetter
    ->setCode('return $this->objectProphecy;');
  if ($node
    ->hasMethod('__call')) {
    $__call = $node
      ->getMethod('__call');
  }
  else {
    $__call = new MethodNode('__call');
    $__call
      ->addArgument(new ArgumentNode('name'));
    $__call
      ->addArgument(new ArgumentNode('arguments'));
    $node
      ->addMethod($__call);
  }
  $__call
    ->setCode(<<<PHP
throw new \\Prophecy\\Exception\\Doubler\\MethodNotFoundException(
    sprintf('Method `%s::%s()` not found.', get_class(\$this), func_get_arg(0)),
    \$this->getProphecy(), func_get_arg(0)
);
PHP
);
  $node
    ->addMethod($prophecySetter);
  $node
    ->addMethod($prophecyGetter);
}