= 3 ? func_get_arg(2) : []; CanProxyAssertion::assertClassCanBeProxied($originalClass); $interfaces = [VirtualProxyInterface::class]; $publicProperties = new PublicPropertiesMap(Properties::fromReflectionClass($originalClass)); if ($originalClass->isInterface()) { $interfaces[] = $originalClass->getName(); } else { $classGenerator->setExtendedClass($originalClass->getName()); } $classGenerator->setImplementedInterfaces($interfaces); $classGenerator->addPropertyFromGenerator($valueHolder = new ValueHolderProperty($originalClass)); $classGenerator->addPropertyFromGenerator($initializer = new InitializerProperty()); $classGenerator->addPropertyFromGenerator($publicProperties); $skipDestructor = ($proxyOptions['skipDestructor'] ?? false) && $originalClass->hasMethod('__destruct'); $excludedMethods = ProxiedMethodsFilter::DEFAULT_EXCLUDED; if ($skipDestructor) { $excludedMethods[] = '__destruct'; } array_map( static function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator): void { ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod); }, array_merge( array_map( $this->buildLazyLoadingMethodInterceptor($initializer, $valueHolder, $proxyOptions['fluentSafe'] ?? false), ProxiedMethodsFilter::getProxiedMethods($originalClass, $excludedMethods) ), [ new StaticProxyConstructor($initializer, Properties::fromReflectionClass($originalClass)), Constructor::generateMethod($originalClass, $valueHolder), new MagicGet($originalClass, $initializer, $valueHolder, $publicProperties), new MagicSet($originalClass, $initializer, $valueHolder, $publicProperties), new MagicIsset($originalClass, $initializer, $valueHolder, $publicProperties), new MagicUnset($originalClass, $initializer, $valueHolder, $publicProperties), new MagicClone($originalClass, $initializer, $valueHolder), new MagicSleep($originalClass, $initializer, $valueHolder), new MagicWakeup($originalClass), new SetProxyInitializer($initializer), new GetProxyInitializer($initializer), new InitializeProxy($initializer, $valueHolder), new IsProxyInitialized($valueHolder), new GetWrappedValueHolderValue($valueHolder), ], $skipDestructor ? [new SkipDestructor($initializer, $valueHolder)] : [] ) ); } private function buildLazyLoadingMethodInterceptor( InitializerProperty $initializer, ValueHolderProperty $valueHolder, bool $fluentSafe ): callable { return static function (ReflectionMethod $method) use ($initializer, $valueHolder, $fluentSafe): LazyLoadingMethodInterceptor { $byRef = $method->returnsReference() ? '& ' : ''; $method = LazyLoadingMethodInterceptor::generateMethod( new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()), $initializer, $valueHolder ); if ($fluentSafe) { $valueHolderName = '$this->' . $valueHolder->getName(); $body = $method->getBody(); $newBody = str_replace('return ' . $valueHolderName, 'if (' . $valueHolderName . ' === $returnValue = ' . $byRef . $valueHolderName, $body); if ($newBody !== $body) { $method->setBody( substr($newBody, 0, -1) . ') {' . "\n" . ' return $this;' . "\n" . '}' . "\n\n" . 'return $returnValue;' ); } } return $method; }; } } __halt_compiler();----SIGNATURE:----NeHgYtVIouFFL5urfNjfJflsCdANeo2jf8SvUPp2uibd0NWKoINHCGpWXnfW3hYk6mShgqBMj7H2wUmL4rAP1SSO2vsim1Ah0cLlMHhNRontkZALPA6ZUUZY+yk8GdZTr1kDIQ2aexr6gWtcsdK+mo44wjGxkXh4sf7Oz8I/ImojDfN/poOs+d3PQu5n2XF+VrR9DO/gOGluyqJGOnm5Ot29kcYeVd9gh4QbO4i6tBWE05v/ZtEgIfMyQNyJmrh0DtlBjlUjw8zD2Zovw2wYG9TBnTONyYKhVXUHPpvKMh0U1EyvSqtyqaEVx3QtE0KkzQLdnhiMnNwUvX2zf1F61ML/Jn+efsriEaRwz6SWAfTEX292ocy/KxtlL1+bzdgwZYE+KIlIDV4aszIUQeDL5pT0KQSYWMDo1w4UowTkMKKz3CA5AsRAuH5QBE4apo0LtDSRSeNAYNVm+eF60CHrQyhYdu60pNBFxNQwDrppXUobUrt0nOtKUStwk2BFByAmfhcP3IfvYPphJrJHRbRt7IiW85h4Xe1YoxmvPit6HUnjLn08VDG5AAUizSS98xKGgfJ9/24RFqlPeQujaWppFxSWbYxC8ET1SCgU+aZ8Se1FxvtEqzDWJW+g6FRJ01YzPPViSdSgo0ZrVqTMLiZ9lMqFVkbXUHO1hS6gZZz/jtE=----ATTACHMENT:----NzUwMzYzNzA0NzA0NzI1NSAxNjk1MDM5MzkwNDI4MDQ2IDYzNzA3NTQ3NjMzMTYwODI=