@@ -25,13 +25,12 @@ final public static function invariants(): array
25
25
$ invariants = [];
26
26
foreach (get_class_methods (static ::class) as $ invariant ) {
27
27
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 ));
35
34
}
36
35
}
37
36
@@ -55,48 +54,58 @@ final public static function invariants(): array
55
54
* $onFail function must have the following signature:
56
55
* fn(array<string, string>) => void
57
56
*
58
- * @param callable|null $onFail
57
+ * @param string|callable $onFail
59
58
*
60
59
* @return void
61
60
*/
62
- private function check (callable $ onFail = null ): void
61
+ private function check (string | callable $ onFail = ' invariantHandler ' ): void
63
62
{
64
- $ handler = 'invariantHandler ' ;
63
+ $ violations = $ this ->computeInvariantViolations ();
64
+ if (!empty ($ violations )) {
65
+ call_user_func_array ($ this ->computeInvariantHandler ($ onFail ), [$ violations ]);
66
+ }
67
+ }
65
68
69
+ /**
70
+ * Computes the list of invariant violations.
71
+ *
72
+ * @return array<string, string>
73
+ */
74
+ private function computeInvariantViolations (): array
75
+ {
66
76
$ violations = [];
67
77
foreach (static ::invariants () as $ invariant => $ rule ) {
68
78
try {
69
- if (!call_user_func_array ([ $ this , $ invariant], [] )) {
79
+ if (!$ this ->{ $ invariant}( )) {
70
80
$ violations [$ invariant ] = $ rule ;
71
81
}
72
82
} catch (Exception $ e ) {
73
83
$ violations [$ invariant ] = $ e ->getMessage ();
74
84
}
75
85
}
76
86
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
+ }
89
89
90
- )
91
- );
92
- };
90
+ private function computeInvariantHandler (string |callable $ handlerFn ): callable
91
+ {
92
+ if (!is_string ($ handlerFn )) {
93
+ return $ handlerFn ;
94
+ }
93
95
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 ) ;
97
99
}
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 ),
98
106
99
- $ onFail ($ violations );
100
- }
107
+ )
108
+ );
109
+ };
101
110
}
102
111
}
0 commit comments