* @license MIT */ class AccessInterceptorValueHolderGenerator implements ProxyGeneratorInterface { /** * {@inheritDoc} */ public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator) { CanProxyAssertion::assertClassCanBeProxied($originalClass); $publicProperties = new PublicPropertiesMap($originalClass); $interfaces = array( 'ProxyManager\\Proxy\\AccessInterceptorInterface', 'ProxyManager\\Proxy\\ValueHolderInterface', ); if ($originalClass->isInterface()) { $interfaces[] = $originalClass->getName(); } else { $classGenerator->setExtendedClass($originalClass->getName()); } $classGenerator->setImplementedInterfaces($interfaces); $classGenerator->addPropertyFromGenerator($valueHolder = new ValueHolderProperty()); $classGenerator->addPropertyFromGenerator($prefixInterceptors = new MethodPrefixInterceptors()); $classGenerator->addPropertyFromGenerator($suffixInterceptors = new MethodSuffixInterceptors()); $classGenerator->addPropertyFromGenerator($publicProperties); array_map( function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) { ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod); }, array_merge( array_map( function (ReflectionMethod $method) use ($prefixInterceptors, $suffixInterceptors, $valueHolder) { return InterceptedMethod::generateMethod( new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()), $valueHolder, $prefixInterceptors, $suffixInterceptors ); }, ProxiedMethodsFilter::getProxiedMethods($originalClass) ), array( new Constructor($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors), new GetWrappedValueHolderValue($valueHolder), new SetMethodPrefixInterceptor($prefixInterceptors), new SetMethodSuffixInterceptor($suffixInterceptors), new MagicGet( $originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors, $publicProperties ), new MagicSet( $originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors, $publicProperties ), new MagicIsset( $originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors, $publicProperties ), new MagicUnset( $originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors, $publicProperties ), new MagicClone($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors), new MagicSleep($originalClass, $valueHolder), new MagicWakeup($originalClass, $valueHolder), ) ) ); } }