Пример #1
0
    /**
     * 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;
    }