@@ -22,16 +22,63 @@ public function autoload(string $class): void
22
22
23
23
$ namespace = explode ('\\' , ltrim ($ class , '\\' ));
24
24
$ proxyClassname = array_pop ($ namespace );
25
+ $ proxyBaseClass = '' ;
25
26
$ originalClassname = implode ('\\' , $ namespace );
26
27
$ namespace = implode ('\\' , $ namespace );
27
- $ markerInterface = '\Magento\Framework\ObjectManager\NoninterceptableInterface ' ;
28
+ $ proxyInterface = ['\Magento\Framework\ObjectManager\NoninterceptableInterface ' ];
29
+ $ methods = '' ;
30
+
31
+ $ reflectionClass = new \ReflectionClass ($ originalClassname );
32
+ if ($ reflectionClass ->isInterface ()) {
33
+ $ proxyInterface [] = '\\' . $ originalClassname ;
34
+ foreach ($ reflectionClass ->getMethods (\ReflectionMethod::IS_PUBLIC ) as $ method ) {
35
+ $ returnType = $ method ->getReturnType () ?: '' ;
36
+ if ($ returnType instanceof \ReflectionType) {
37
+ $ returnType = ': ' . $ returnType ->getName ();
38
+ }
39
+
40
+ $ params = [];
41
+ foreach ($ method ->getParameters () as $ parameter ) {
42
+ $ paramType = $ parameter ->getType () ?: '' ;
43
+ if ($ paramType instanceof \ReflectionType) {
44
+ if ($ paramType ->isBuiltin ()) {
45
+ $ paramType = $ paramType ->getName () . ' ' ;
46
+ } else {
47
+ $ paramType = '\\' . $ paramType ->getName () . ' ' ;
48
+ }
49
+ }
50
+
51
+ $ defaultValue = '' ;
52
+ if ($ parameter ->isDefaultValueAvailable ()) {
53
+ switch ($ parameter ->getDefaultValue ()) {
54
+ case null :
55
+ $ defaultValue = ' = NULL ' ;
56
+ break ;
57
+ case false :
58
+ $ defaultValue = ' = false ' ;
59
+ break ;
60
+ default :
61
+ $ defaultValue = ' = ' . $ parameter ->getDefaultValue ();
62
+ break ;
63
+ }
64
+ }
65
+
66
+ $ params [] = $ paramType . '$ ' . $ parameter ->getName () . $ defaultValue ;
67
+ }
68
+
69
+ $ methods .= ' public function ' . $ method ->getName () . '( ' . implode (', ' , $ params ) . ') ' .
70
+ $ returnType . " {} \n\n" ;
71
+ }
72
+ } else {
73
+ $ proxyBaseClass = ' extends ' . $ originalClassname ;
74
+ }
28
75
29
76
$ template = "<?php \n" ;
30
77
$ template .= "namespace {NAMESPACE}; \n" ;
31
78
$ template .= "/** \n" ;
32
79
$ template .= " * Proxy class for @see {CLASSNAME} \n" ;
33
80
$ template .= " */ \n" ;
34
- $ template .= "class {PROXY_CLASSNAME} extends {CLASSNAME } implements {MARKER_INTERFACE } \n" ;
81
+ $ template .= "class {PROXY_CLASSNAME}{PROXY_BASE_CLASSNAME } implements {PROXY_INTERFACE } \n" ;
35
82
$ template .= "{ \n" ;
36
83
$ template .= " /** \n" ;
37
84
$ template .= " * @return array \n" ;
@@ -45,11 +92,26 @@ public function autoload(string $class): void
45
92
$ template .= " * Clone proxied instance \n" ;
46
93
$ template .= " */ \n" ;
47
94
$ template .= " public function __clone() {} \n" ;
95
+ $ template .= "{METHODS} " ;
48
96
$ template .= "} \n" ;
49
97
50
98
$ template = str_replace (
51
- ['{NAMESPACE} ' , '{CLASSNAME} ' , '{PROXY_CLASSNAME} ' , '{MARKER_INTERFACE} ' ],
52
- [$ namespace , $ originalClassname , $ proxyClassname , $ markerInterface ],
99
+ [
100
+ '{NAMESPACE} ' ,
101
+ '{CLASSNAME} ' ,
102
+ '{PROXY_BASE_CLASSNAME} ' ,
103
+ '{PROXY_CLASSNAME} ' ,
104
+ '{PROXY_INTERFACE} ' ,
105
+ '{METHODS} '
106
+ ],
107
+ [
108
+ $ namespace ,
109
+ $ originalClassname ,
110
+ $ proxyBaseClass ,
111
+ $ proxyClassname ,
112
+ implode (', ' , $ proxyInterface ),
113
+ $ methods
114
+ ],
53
115
$ template
54
116
);
55
117
0 commit comments