/** * Constructor */ public function __construct(ReflectionClass $originalClass, PropertyGenerator $prefixInterceptors, PropertyGenerator $suffixInterceptors) { parent::__construct('__construct'); $localizedObject = new ParameterGenerator('localizedObject'); $prefix = new ParameterGenerator('prefixInterceptors'); $suffix = new ParameterGenerator('suffixInterceptors'); $localizedObject->setType($originalClass->getName()); $prefix->setDefaultValue(array()); $suffix->setDefaultValue(array()); $prefix->setType('array'); $suffix->setType('array'); $this->setParameter($localizedObject); $this->setParameter($prefix); $this->setParameter($suffix); $localizedProperties = array(); foreach ($originalClass->getProperties() as $originalProperty) { if (!method_exists('Closure', 'bind') && $originalProperty->isPrivate()) { // @codeCoverageIgnoreStart throw UnsupportedProxiedClassException::unsupportedLocalizedReflectionProperty($originalProperty); // @codeCoverageIgnoreEnd } $propertyName = $originalProperty->getName(); if ($originalProperty->isPrivate()) { $localizedProperties[] = "\\Closure::bind(function () use (\$localizedObject) {\n " . '$this->' . $propertyName . ' = & $localizedObject->' . $propertyName . ";\n" . '}, $this, ' . var_export($originalProperty->getDeclaringClass()->getName(), true) . ')->__invoke();'; } else { $localizedProperties[] = '$this->' . $propertyName . ' = & $localizedObject->' . $propertyName . ";"; } } $this->setDocblock("@override constructor to setup interceptors\n\n" . "@param \\" . $originalClass->getName() . " \$localizedObject\n" . "@param \\Closure[] \$prefixInterceptors method interceptors to be used before method logic\n" . "@param \\Closure[] \$suffixInterceptors method interceptors to be used before method logic"); $this->setBody((empty($localizedProperties) ? '' : implode("\n\n", $localizedProperties) . "\n\n") . '$this->' . $prefixInterceptors->getName() . " = \$prefixInterceptors;\n" . '$this->' . $suffixInterceptors->getName() . " = \$suffixInterceptors;"); }
/** * @covers \ProxyManager\Exception\UnsupportedProxiedClassException::unsupportedLocalizedReflectionProperty */ public function testUnsupportedLocalizedReflectionProperty() { $this->assertSame('Provided reflection property "property0" of class "ProxyManagerTestAsset\\ClassWithPrivateProperties" ' . 'is private and cannot be localized in PHP 5.3', UnsupportedProxiedClassException::unsupportedLocalizedReflectionProperty(new ReflectionProperty('ProxyManagerTestAsset\\ClassWithPrivateProperties', 'property0'))->getMessage()); }