' . $adapterProperty->getName() . '->call(' . var_export($originalClass->getName(), true) . ', ' . var_export($originalMethod->getName(), true) . ', $args);' . "\n\n" . ProxiedMethodReturnExpression::generate('$return', $originalMethod); $defaultValues = self::getDefaultValuesForMethod($originalMethod); $method->setBody( strtr( self::TEMPLATE, [ '#PROXIED_RETURN#' => $proxiedReturn, '#DEFAULT_VALUES#' => $defaultValues, ] ) ); return $method; } private static function getDefaultValuesForMethod(MethodReflection $originalMethod): string { $defaultValues = ''; foreach ($originalMethod->getParameters() as $i => $parameter) { if ($parameter->isOptional() && $parameter->isDefaultValueAvailable()) { $default = new ValueGenerator($parameter->getDefaultValue(), $parameter); $defaultValues .= sprintf("\n case %d: \$args[] = %s;", $i, $default->generate()); continue; } if ($parameter->isVariadic()) { continue; } $defaultValues .= sprintf("\n case %d: \$args[] = null;", $i); } return $defaultValues; } }