getName(); $valueHolderName = $valueHolderProperty->getName(); $parameters = $originalMethod->getParameters(); $methodName = $originalMethod->getName(); $initializerParams = []; $forwardedParams = []; foreach ($parameters as $parameter) { $parameterName = $parameter->getName(); $variadicPrefix = $parameter->isVariadic() ? '...' : ''; $initializerParams[] = var_export($parameterName, true) . ' => $' . $parameterName; $forwardedParams[] = $variadicPrefix . '$' . $parameterName; } $method->setBody( '$this->' . $initializerName . ' && ($this->' . $initializerName . '->__invoke($' . $valueHolderName . ', $this, ' . var_export($methodName, true) . ', array(' . implode(', ', $initializerParams) . '), $this->' . $initializerName . ') || 1)' . ' && $this->' . $valueHolderName . ' = $' . $valueHolderName . ";\n\n" . ProxiedMethodReturnExpression::generate( '$this->' . $valueHolderName . '->' . $methodName . '(' . implode(', ', $forwardedParams) . ')', $originalMethod ) ); return $method; } }