/** * Creates definition for trait method body * * @param ReflectionFunction|ParsedFunction $function Method reflection * * @return string new method body */ protected function getJoinpointInvocationBody($function) { $class = '\\' . __CLASS__; $dynamicArgs = false; $hasOptionals = false; $hasReferences = false; $argValues = array_map(function ($param) use(&$dynamicArgs, &$hasOptionals, &$hasReferences) { /** @var $param Parameter|ParsedParameter */ $byReference = $param->isPassedByReference(); $dynamicArg = $param->name == '...'; $dynamicArgs = $dynamicArgs || $dynamicArg; $hasOptionals = $hasOptionals || $param->isOptional() && !$param->isDefaultValueAvailable(); $hasReferences = $hasReferences || $byReference; return ($byReference ? '&' : '') . '$' . $param->name; }, $function->getParameters()); if ($dynamicArgs) { // Remove last '...' argument array_pop($argValues); } $args = join(', ', $argValues); if ($dynamicArgs) { $args = $hasReferences ? "array({$args}) + \\func_get_args()" : '\\func_get_args()'; } elseif ($hasOptionals) { $args = "\\array_slice(array({$args}), 0, \\func_num_args())"; } else { $args = "array({$args})"; } return <<<BODY static \$__joinPoint = null; if (!\$__joinPoint) { \$__joinPoint = {$class}::getJoinPoint('{$function->name}', __NAMESPACE__); } return \$__joinPoint->__invoke({$args}); BODY; }