public function build($methodName, array $interceptedMethods, $targetClassName)
{
if ($methodName === '__construct') {
throw new Exception('The ' . __CLASS__ . ' cannot build constructor interceptor code.', 1173107446);
}
$declaringClassName = $interceptedMethods[$methodName]['declaringClassName'];
$proxyMethod = $this->compiler->getProxyClass($targetClassName)->getMethod($methodName);
if ($declaringClassName !== $targetClassName) {
$proxyMethod->setMethodParametersCode($proxyMethod->buildMethodParametersCode($declaringClassName, $methodName, true));
}
$groupedAdvices = $interceptedMethods[$methodName]['groupedAdvices'];
$advicesCode = $this->buildAdvicesCode($groupedAdvices, $methodName, $targetClassName, $declaringClassName);
if ($methodName !== null || $methodName === '__wakeup') {
$proxyMethod->addPreParentCallCode('
if (isset($this->Flow_Aop_Proxy_methodIsInAdviceMode[\'' . $methodName . '\'])) {
');
$proxyMethod->addPostParentCallCode('
} else {
$this->Flow_Aop_Proxy_methodIsInAdviceMode[\'' . $methodName . '\'] = TRUE;
try {
' . $advicesCode . '
} catch (\\Exception $exception) {
unset($this->Flow_Aop_Proxy_methodIsInAdviceMode[\'' . $methodName . '\']);
throw $exception;
}
unset($this->Flow_Aop_Proxy_methodIsInAdviceMode[\'' . $methodName . '\']);
}
');
}
}