@@ -25,13 +25,12 @@ final public static function invariants(): array
2525 $ invariants = [];
2626 foreach (get_class_methods (static ::class) as $ invariant ) {
2727 if (str_starts_with ($ invariant , 'invariant ' ) && !in_array ($ invariant , ['invariants ' , 'invariantHandler ' ])) {
28- $ invariants [$ invariant ] = str_replace (
29- 'invariant ' ,
30- '' ,
31- strtolower (
32- preg_replace ('/[A-Z]([A-Z](?![a-z]))*/ ' , ' $0 ' , $ invariant )
33- )
34- );
28+ $ invariantRuleName = preg_replace ('/[A-Z]([A-Z](?![a-z]))*/ ' , ' $0 ' , $ invariant );
29+ if (is_null ($ invariantRuleName )) {
30+ continue ;
31+ }
32+
33+ $ invariants [$ invariant ] = str_replace ('invariant ' , '' , strtolower ($ invariantRuleName ));
3534 }
3635 }
3736
@@ -55,48 +54,58 @@ final public static function invariants(): array
5554 * $onFail function must have the following signature:
5655 * fn(array<string, string>) => void
5756 *
58- * @param callable|null $onFail
57+ * @param string|callable $onFail
5958 *
6059 * @return void
6160 */
62- private function check (callable $ onFail = null ): void
61+ private function check (string | callable $ onFail = ' invariantHandler ' ): void
6362 {
64- $ handler = 'invariantHandler ' ;
63+ $ violations = $ this ->computeInvariantViolations ();
64+ if (!empty ($ violations )) {
65+ call_user_func_array ($ this ->computeInvariantHandler ($ onFail ), [$ violations ]);
66+ }
67+ }
6568
69+ /**
70+ * Computes the list of invariant violations.
71+ *
72+ * @return array<string, string>
73+ */
74+ private function computeInvariantViolations (): array
75+ {
6676 $ violations = [];
6777 foreach (static ::invariants () as $ invariant => $ rule ) {
6878 try {
69- if (!call_user_func_array ([ $ this , $ invariant], [] )) {
79+ if (!$ this ->{ $ invariant}( )) {
7080 $ violations [$ invariant ] = $ rule ;
7181 }
7282 } catch (Exception $ e ) {
7383 $ violations [$ invariant ] = $ e ->getMessage ();
7484 }
7585 }
7686
77- if (!empty ($ violations )) {
78- if (is_null ($ onFail )) {
79- $ customizedHandler = function (array $ violations ) use ($ handler ): void {
80- call_user_func_array ([$ this , $ handler ], [$ violations ]);
81- };
82-
83- $ defaultHandler = function (array $ violations ): void {
84- throw new InvariantViolation (
85- sprintf (
86- "Unable to create %s due %s " ,
87- basename (str_replace ('\\' , '/ ' , static ::class)),
88- implode (", " , $ violations ),
87+ return $ violations ;
88+ }
8989
90- )
91- );
92- };
90+ private function computeInvariantHandler (string |callable $ handlerFn ): callable
91+ {
92+ if (!is_string ($ handlerFn )) {
93+ return $ handlerFn ;
94+ }
9395
94- $ onFail = ( method_exists ($ this , $ handler ) )
95- ? $ customizedHandler
96- : $ defaultHandler ;
96+ return method_exists ($ this , $ handlerFn )
97+ ? function ( array $ violations ) use ( $ handlerFn ): void {
98+ $ this ->{ $ handlerFn }( $ violations ) ;
9799 }
100+ : function (array $ violations ): void {
101+ throw new InvariantViolation (
102+ sprintf (
103+ "Unable to create %s due %s " ,
104+ basename (str_replace ('\\' , '/ ' , static ::class)),
105+ implode (", " , $ violations ),
98106
99- $ onFail ($ violations );
100- }
107+ )
108+ );
109+ };
101110 }
102111}
0 commit comments