Skip to content

Commit dd6153d

Browse files
committed
Merge pull request #189 from malukenho/bugfix/extends-private-magic-methods
Bugfix on inherit private magic methods
2 parents 10a871f + 05fd973 commit dd6153d

11 files changed

Lines changed: 442 additions & 162 deletions
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
/*
3+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14+
*
15+
* This software consists of voluntary contributions made by many individuals
16+
* and is licensed under the MIT license.
17+
*/
18+
19+
namespace ProxyManager\Generator\Util;
20+
21+
use ReflectionClass;
22+
use Zend\Code\Generator\MethodGenerator;
23+
use Zend\Code\Generator\ClassGenerator as GeneratorClass;
24+
25+
/**
26+
* Util class to help to generate code
27+
*
28+
* @author Jefersson Nathan <malukenho@phpse.net>
29+
* @license MIT
30+
*/
31+
final class ClassGeneratorUtils
32+
{
33+
/**
34+
* @param ReflectionClass $originalClass
35+
* @param GeneratorClass $classGenerator
36+
* @param MethodGenerator $generatedMethod
37+
*
38+
* @return void|false
39+
*/
40+
public static function addMethodIfNotFinal(
41+
ReflectionClass $originalClass,
42+
GeneratorClass $classGenerator,
43+
MethodGenerator $generatedMethod
44+
) {
45+
$methodName = $generatedMethod->getName();
46+
47+
if ($originalClass->hasMethod($methodName) && $originalClass->getMethod($methodName)->isFinal()) {
48+
return false;
49+
}
50+
51+
$classGenerator->addMethodFromGenerator($generatedMethod);
52+
}
53+
}

src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizerGenerator.php

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
namespace ProxyManager\ProxyGenerator;
2020

2121
use ProxyManager\Exception\InvalidProxiedClassException;
22+
use ProxyManager\Generator\Util\ClassGeneratorUtils;
2223
use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodPrefixInterceptor;
2324
use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodSuffixInterceptor;
2425
use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors;
@@ -32,7 +33,9 @@
3233
use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicUnset;
3334
use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
3435
use ReflectionClass;
36+
use ReflectionMethod;
3537
use Zend\Code\Generator\ClassGenerator;
38+
use Zend\Code\Generator\MethodGenerator;
3639
use Zend\Code\Reflection\MethodReflection;
3740

3841
/**
@@ -60,43 +63,36 @@ public function generate(ReflectionClass $originalClass, ClassGenerator $classGe
6063
$classGenerator->addPropertyFromGenerator($prefixInterceptors = new MethodPrefixInterceptors());
6164
$classGenerator->addPropertyFromGenerator($suffixInterceptors = new MethodPrefixInterceptors());
6265

63-
$methods = ProxiedMethodsFilter::getProxiedMethods(
64-
$originalClass,
65-
array('__get', '__set', '__isset', '__unset', '__clone', '__sleep')
66-
);
67-
68-
foreach ($methods as $method) {
69-
$classGenerator->addMethodFromGenerator(
70-
InterceptedMethod::generateMethod(
71-
new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
72-
$prefixInterceptors,
73-
$suffixInterceptors
66+
array_map(
67+
function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
68+
ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
69+
},
70+
array_merge(
71+
array_map(
72+
function (ReflectionMethod $method) use ($prefixInterceptors, $suffixInterceptors) {
73+
return InterceptedMethod::generateMethod(
74+
new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
75+
$prefixInterceptors,
76+
$suffixInterceptors
77+
);
78+
},
79+
ProxiedMethodsFilter::getProxiedMethods(
80+
$originalClass,
81+
array('__get', '__set', '__isset', '__unset', '__clone', '__sleep')
82+
)
83+
),
84+
array(
85+
new Constructor($originalClass, $prefixInterceptors, $suffixInterceptors),
86+
new SetMethodPrefixInterceptor($prefixInterceptors),
87+
new SetMethodSuffixInterceptor($suffixInterceptors),
88+
new MagicGet($originalClass, $prefixInterceptors, $suffixInterceptors),
89+
new MagicSet($originalClass, $prefixInterceptors, $suffixInterceptors),
90+
new MagicIsset($originalClass, $prefixInterceptors, $suffixInterceptors),
91+
new MagicUnset($originalClass, $prefixInterceptors, $suffixInterceptors),
92+
new MagicSleep($originalClass, $prefixInterceptors, $suffixInterceptors),
93+
new MagicClone($originalClass, $prefixInterceptors, $suffixInterceptors),
7494
)
75-
);
76-
}
77-
78-
$classGenerator->addMethodFromGenerator(
79-
new Constructor($originalClass, $prefixInterceptors, $suffixInterceptors)
80-
);
81-
$classGenerator->addMethodFromGenerator(new SetMethodPrefixInterceptor($prefixInterceptors));
82-
$classGenerator->addMethodFromGenerator(new SetMethodSuffixInterceptor($suffixInterceptors));
83-
$classGenerator->addMethodFromGenerator(
84-
new MagicGet($originalClass, $prefixInterceptors, $suffixInterceptors)
85-
);
86-
$classGenerator->addMethodFromGenerator(
87-
new MagicSet($originalClass, $prefixInterceptors, $suffixInterceptors)
88-
);
89-
$classGenerator->addMethodFromGenerator(
90-
new MagicIsset($originalClass, $prefixInterceptors, $suffixInterceptors)
91-
);
92-
$classGenerator->addMethodFromGenerator(
93-
new MagicUnset($originalClass, $prefixInterceptors, $suffixInterceptors)
94-
);
95-
$classGenerator->addMethodFromGenerator(
96-
new MagicSleep($originalClass, $prefixInterceptors, $suffixInterceptors)
97-
);
98-
$classGenerator->addMethodFromGenerator(
99-
new MagicClone($originalClass, $prefixInterceptors, $suffixInterceptors)
95+
)
10096
);
10197
}
10298
}

src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolderGenerator.php

Lines changed: 56 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
namespace ProxyManager\ProxyGenerator;
2020

21+
use ProxyManager\Generator\Util\ClassGeneratorUtils;
2122
use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup;
2223
use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodPrefixInterceptor;
2324
use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodSuffixInterceptor;
@@ -36,7 +37,9 @@
3637
use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\GetWrappedValueHolderValue;
3738
use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\MagicSleep;
3839
use ReflectionClass;
40+
use ReflectionMethod;
3941
use Zend\Code\Generator\ClassGenerator;
42+
use Zend\Code\Generator\MethodGenerator;
4043
use Zend\Code\Reflection\MethodReflection;
4144

4245
/**
@@ -73,54 +76,60 @@ public function generate(ReflectionClass $originalClass, ClassGenerator $classGe
7376
$classGenerator->addPropertyFromGenerator($suffixInterceptors = new MethodSuffixInterceptors());
7477
$classGenerator->addPropertyFromGenerator($publicProperties);
7578

76-
foreach (ProxiedMethodsFilter::getProxiedMethods($originalClass) as $method) {
77-
$classGenerator->addMethodFromGenerator(
78-
InterceptedMethod::generateMethod(
79-
new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
80-
$valueHolder,
81-
$prefixInterceptors,
82-
$suffixInterceptors
79+
array_map(
80+
function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator, $valueHolder) {
81+
ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
82+
},
83+
array_merge(
84+
array_map(
85+
function (ReflectionMethod $method) use ($prefixInterceptors, $suffixInterceptors, $valueHolder) {
86+
return InterceptedMethod::generateMethod(
87+
new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
88+
$valueHolder,
89+
$prefixInterceptors,
90+
$suffixInterceptors
91+
);
92+
},
93+
ProxiedMethodsFilter::getProxiedMethods($originalClass)
94+
),
95+
array(
96+
new Constructor($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors),
97+
new GetWrappedValueHolderValue($valueHolder),
98+
new SetMethodPrefixInterceptor($prefixInterceptors),
99+
new SetMethodSuffixInterceptor($suffixInterceptors),
100+
new MagicGet(
101+
$originalClass,
102+
$valueHolder,
103+
$prefixInterceptors,
104+
$suffixInterceptors,
105+
$publicProperties
106+
),
107+
new MagicSet(
108+
$originalClass,
109+
$valueHolder,
110+
$prefixInterceptors,
111+
$suffixInterceptors,
112+
$publicProperties
113+
),
114+
new MagicIsset(
115+
$originalClass,
116+
$valueHolder,
117+
$prefixInterceptors,
118+
$suffixInterceptors,
119+
$publicProperties
120+
),
121+
new MagicUnset(
122+
$originalClass,
123+
$valueHolder,
124+
$prefixInterceptors,
125+
$suffixInterceptors,
126+
$publicProperties
127+
),
128+
new MagicClone($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors),
129+
new MagicSleep($originalClass, $valueHolder),
130+
new MagicWakeup($originalClass, $valueHolder),
83131
)
84-
);
85-
}
86-
87-
$classGenerator->addMethodFromGenerator(
88-
new Constructor($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors)
89-
);
90-
$classGenerator->addMethodFromGenerator(
91-
new GetWrappedValueHolderValue($valueHolder)
92-
);
93-
$classGenerator->addMethodFromGenerator(
94-
new SetMethodPrefixInterceptor($prefixInterceptors)
95-
);
96-
$classGenerator->addMethodFromGenerator(
97-
new SetMethodSuffixInterceptor($suffixInterceptors)
98-
);
99-
100-
$classGenerator->addMethodFromGenerator(
101-
new MagicGet($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors, $publicProperties)
102-
);
103-
104-
$classGenerator->addMethodFromGenerator(
105-
new MagicSet($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors, $publicProperties)
106-
);
107-
108-
$classGenerator->addMethodFromGenerator(
109-
new MagicIsset($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors, $publicProperties)
110-
);
111-
112-
$classGenerator->addMethodFromGenerator(
113-
new MagicUnset($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors, $publicProperties)
114-
);
115-
116-
$classGenerator->addMethodFromGenerator(
117-
new MagicClone($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors)
118-
);
119-
$classGenerator->addMethodFromGenerator(
120-
new MagicSleep($originalClass, $valueHolder)
121-
);
122-
$classGenerator->addMethodFromGenerator(
123-
new MagicWakeup($originalClass, $valueHolder)
132+
)
124133
);
125134
}
126135
}

src/ProxyManager/ProxyGenerator/LazyLoadingGhostGenerator.php

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
namespace ProxyManager\ProxyGenerator;
2020

21+
use ProxyManager\Generator\Util\ClassGeneratorUtils;
2122
use ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\Constructor;
2223
use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\CallInitializer;
2324
use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\GetProxyInitializer;
@@ -37,7 +38,9 @@
3738
use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
3839
use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
3940
use ReflectionClass;
41+
use ReflectionMethod;
4042
use Zend\Code\Generator\ClassGenerator;
43+
use Zend\Code\Generator\MethodGenerator;
4144
use Zend\Code\Reflection\MethodReflection;
4245

4346
/**
@@ -73,30 +76,36 @@ public function generate(ReflectionClass $originalClass, ClassGenerator $classGe
7376

7477
$init = new CallInitializer($initializer, $publicPropsDefaults, $initializationTracker);
7578

76-
$classGenerator->addMethodFromGenerator($init);
77-
78-
foreach (ProxiedMethodsFilter::getProxiedMethods($originalClass) as $method) {
79-
$classGenerator->addMethodFromGenerator(
80-
LazyLoadingMethodInterceptor::generateMethod(
81-
new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
82-
$initializer,
83-
$init
79+
array_map(
80+
function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
81+
ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
82+
},
83+
array_merge(
84+
array_map(
85+
function (ReflectionMethod $method) use ($initializer, $init) {
86+
return LazyLoadingMethodInterceptor::generateMethod(
87+
new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
88+
$initializer,
89+
$init
90+
);
91+
},
92+
ProxiedMethodsFilter::getProxiedMethods($originalClass)
93+
),
94+
array(
95+
$init,
96+
new Constructor($originalClass, $initializer),
97+
new MagicGet($originalClass, $initializer, $init, $publicProperties),
98+
new MagicSet($originalClass, $initializer, $init, $publicProperties),
99+
new MagicIsset($originalClass, $initializer, $init, $publicProperties),
100+
new MagicUnset($originalClass, $initializer, $init, $publicProperties),
101+
new MagicClone($originalClass, $initializer, $init, $publicProperties),
102+
new MagicSleep($originalClass, $initializer, $init, $publicProperties),
103+
new SetProxyInitializer($initializer),
104+
new GetProxyInitializer($initializer),
105+
new InitializeProxy($initializer, $init),
106+
new IsProxyInitialized($initializer),
84107
)
85-
);
86-
}
87-
88-
$classGenerator->addMethodFromGenerator(new Constructor($originalClass, $initializer));
89-
90-
$classGenerator->addMethodFromGenerator(new MagicGet($originalClass, $initializer, $init, $publicProperties));
91-
$classGenerator->addMethodFromGenerator(new MagicSet($originalClass, $initializer, $init, $publicProperties));
92-
$classGenerator->addMethodFromGenerator(new MagicIsset($originalClass, $initializer, $init, $publicProperties));
93-
$classGenerator->addMethodFromGenerator(new MagicUnset($originalClass, $initializer, $init, $publicProperties));
94-
$classGenerator->addMethodFromGenerator(new MagicClone($originalClass, $initializer, $init));
95-
$classGenerator->addMethodFromGenerator(new MagicSleep($originalClass, $initializer, $init));
96-
97-
$classGenerator->addMethodFromGenerator(new SetProxyInitializer($initializer));
98-
$classGenerator->addMethodFromGenerator(new GetProxyInitializer($initializer));
99-
$classGenerator->addMethodFromGenerator(new InitializeProxy($initializer, $init));
100-
$classGenerator->addMethodFromGenerator(new IsProxyInitialized($initializer));
108+
)
109+
);
101110
}
102111
}

0 commit comments

Comments
 (0)