public function ProphecySubjectPatch::apply in Zircon Profile 8.0
Same name and namespace in other branches
- 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\ClassPatchCode
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);
}