* @license MIT */ class LazyLoadingGhostGenerator implements ProxyGeneratorInterface { /** * {@inheritDoc} */ public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator) { CanProxyAssertion::assertClassCanBeProxied($originalClass); $interfaces = array('ProxyManager\\Proxy\\GhostObjectInterface'); $publicProperties = new PublicPropertiesMap($originalClass); $publicPropsDefaults = new PublicPropertiesDefaults($originalClass); if ($originalClass->isInterface()) { $interfaces[] = $originalClass->getName(); } else { $classGenerator->setExtendedClass($originalClass->getName()); } $classGenerator->setImplementedInterfaces($interfaces); $classGenerator->addPropertyFromGenerator($initializer = new InitializerProperty()); $classGenerator->addPropertyFromGenerator($initializationTracker = new InitializationTracker()); $classGenerator->addPropertyFromGenerator($publicProperties); $classGenerator->addPropertyFromGenerator($publicPropsDefaults); $init = new CallInitializer($initializer, $publicPropsDefaults, $initializationTracker); array_map( function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) { ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod); }, array_merge( array_map( function (ReflectionMethod $method) use ($initializer, $init) { return LazyLoadingMethodInterceptor::generateMethod( new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()), $initializer, $init ); }, ProxiedMethodsFilter::getProxiedMethods($originalClass) ), array( $init, new Constructor($originalClass, $initializer), new MagicGet($originalClass, $initializer, $init, $publicProperties), new MagicSet($originalClass, $initializer, $init, $publicProperties), new MagicIsset($originalClass, $initializer, $init, $publicProperties), new MagicUnset($originalClass, $initializer, $init, $publicProperties), new MagicClone($originalClass, $initializer, $init, $publicProperties), new MagicSleep($originalClass, $initializer, $init, $publicProperties), new SetProxyInitializer($initializer), new GetProxyInitializer($initializer), new InitializeProxy($initializer, $init), new IsProxyInitialized($initializer), ) ) ); } }