@@ -51,24 +51,60 @@ public static function invoke(
5151 array $ arguments ,
5252 array $ prioritizedCallHandlerClassNames
5353 )
54+ {
55+ return self ::doInvocation ($ object , $ methodName , $ arguments , $ prioritizedCallHandlerClassNames , false );
56+ }
57+
58+ public static function invokeStatically (
59+ string $ className ,
60+ string $ methodName ,
61+ array $ arguments ,
62+ array $ prioritizedCallHandlerClassNames
63+ )
64+ {
65+ return self ::doInvocation ($ className , $ methodName , $ arguments , $ prioritizedCallHandlerClassNames , true );
66+ }
67+
68+ private static function doInvocation (
69+ $ objectOrClassName ,
70+ string $ methodName ,
71+ array $ arguments ,
72+ array $ prioritizedCallHandlerClassNames ,
73+ bool $ isStatic
74+ )
5475 {
5576 $ instance = self ::instance ();
5677
57- $ classMetadata = $ instance ->classMetadata (
58- get_class ($ object )
59- );
78+ $ className = $ isStatic ? $ objectOrClassName : get_class ($ objectOrClassName );
79+ $ classMetadata = $ instance ->classMetadata ($ className );
80+
81+ foreach ($ prioritizedCallHandlerClassNames as $ callHandlerData ) {
82+ // prepare $callHandlerClassName and $options
83+ if (is_array ($ callHandlerData )) {
84+ $ callHandlerClassName = $ callHandlerData [0 ];
85+ $ options = $ callHandlerData [1 ];
86+ } else {
87+ $ callHandlerClassName = $ callHandlerData ;
88+ $ options = [];
89+ }
6090
61- foreach ( $ prioritizedCallHandlerClassNames as $ callHandlerClassName ) {
91+ // retrieve $callHandler
6292 if (! array_key_exists ($ callHandlerClassName , $ instance ->callHandlers )) {
6393 $ instance ->callHandlers [$ callHandlerClassName ] = new $ callHandlerClassName ();
6494 }
6595
6696 $ callHandler = $ instance ->callHandlers [$ callHandlerClassName ];
6797
68- if ($ callHandler ->canHandle ($ methodName , $ classMetadata , [])) {
69- $ return = $ callHandler ->execute ($ object , $ methodName , $ arguments , $ classMetadata );
98+ // execute
99+ if ($ callHandler ->canHandle ($ methodName , $ classMetadata , $ options )) {
100+ if (! $ isStatic ) {
101+ $ return = $ callHandler ->execute ($ objectOrClassName , $ methodName , $ arguments , $ classMetadata );
102+ } else {
103+ $ return = $ callHandler ->executeStatic ($ objectOrClassName , $ methodName , $ arguments , $ classMetadata );
104+ }
105+
106+ $ instance ->assertReturnType ($ objectOrClassName , $ methodName , $ return , $ classMetadata );
70107
71- $ instance ->assertReturnType ($ object , $ methodName , $ return , $ classMetadata );
72108 return $ return ;
73109 }
74110 }
@@ -88,8 +124,11 @@ private function classMetadata(string $className) : ClassMetadata
88124 ->classMetadata [$ className ];
89125 }
90126
127+ /**
128+ * @param object|string $objectContext
129+ */
91130 private function assertReturnType (
92- object $ object ,
131+ $ objectContext ,
93132 string $ methodName ,
94133 $ returnValue ,
95134 ClassMetadata $ classMetadata
@@ -100,7 +139,7 @@ private function assertReturnType(
100139 $ returnType = $ virtualMethodMetadata ->returnType ;
101140
102141 if (! is_null ($ returnType ->declaration ())) {
103- $ isTypeValid = $ returnType ->validateVariable ($ returnValue , $ object );
142+ $ isTypeValid = $ returnType ->validateVariable ($ returnValue , $ objectContext );
104143
105144 if (! $ isTypeValid ) {
106145 // TODO: Handle error on strict_types declaration of calling context (not file defining the class) :-/
0 commit comments