@@ -22,11 +22,15 @@ final class Collection
2222 * @param array<class-string, array<array{ mixed[], class-string, non-empty-string }>> $targetProperties
2323 * Where _key_ is an attribute class and _value_ an array of arrays
2424 * where 0 are the attribute arguments, 1 is a target class, and 2 is the target property.
25+ * @param array<class-string, array<array{ mixed[], class-string, non-empty-string, non-empty-string }>> $targetMethodParameters
26+ * Where _key_ is an attribute class and _value_ an array of arrays
27+ * where 0 are the attribute arguments, 1 is a target class, 2 is the target method, and 3 is the target parameter.
2528 */
2629 public function __construct (
2730 private array $ targetClasses ,
2831 private array $ targetMethods ,
2932 private array $ targetProperties ,
33+ private array $ targetMethodParameters ,
3034 ) {
3135 }
3236
@@ -109,6 +113,46 @@ private static function createMethodAttribute(
109113 }
110114 }
111115
116+ /**
117+ * @template T of object
118+ *
119+ * @param class-string<T> $attribute
120+ *
121+ * @return array<TargetMethodParameter<T>>
122+ */
123+ public function findTargetMethodParameters (string $ attribute ): array
124+ {
125+ return array_map (
126+ fn (array $ t ) => self ::createMethodParameterAttribute ($ attribute , ...$ t ),
127+ $ this ->targetMethodParameters [$ attribute ] ?? [],
128+ );
129+ }
130+
131+ /**
132+ * @template T of object
133+ *
134+ * @param class-string<T> $attribute
135+ * @param array<mixed> $arguments
136+ * @param class-string $class
137+ * @param non-empty-string $method
138+ * @param non-empty-string $parameter
139+ *
140+ * @return TargetMethodParameter<T>
141+ */
142+ private static function createMethodParameterAttribute (string $ attribute , array $ arguments , string $ class , string $ method , string $ parameter ): object
143+ {
144+ try {
145+ $ a = new $ attribute (...$ arguments );
146+ return new TargetMethodParameter ($ a , $ class , $ method , $ parameter );
147+ } catch (Throwable $ e ) {
148+ throw new RuntimeException (
149+ "An error occurred while instantiating attribute $ attribute on method $ class:: $ method( $ parameter) " ,
150+ 0 ,
151+ $ e ,
152+ );
153+ }
154+ }
155+
112156 /**
113157 * @template T of object
114158 *
@@ -196,6 +240,32 @@ public function filterTargetMethods(callable $predicate): array
196240 return $ ar ;
197241 }
198242
243+ /**
244+ * @param callable(class-string $attribute, class-string $class, non-empty-string $method, non-empty-string $parameter):bool $predicate
245+ *
246+ * @return array<TargetMethodParameter<object>>
247+ */
248+ public function filterTargetMethodParameters (callable $ predicate ): array
249+ {
250+ $ ar = [];
251+
252+ foreach ($ this ->targetMethodParameters as $ attribute => $ references ) {
253+ foreach ($ references as [$ arguments , $ class , $ method , $ parameter ]) {
254+ if ($ predicate ($ attribute , $ class , $ method , $ parameter )) {
255+ $ ar [] = self ::createMethodParameterAttribute (
256+ $ attribute ,
257+ $ arguments ,
258+ $ class ,
259+ $ method ,
260+ $ parameter
261+ );
262+ }
263+ }
264+ }
265+
266+ return $ ar ;
267+ }
268+
199269 /**
200270 * @param callable(class-string $attribute, class-string $class, non-empty-string $property):bool $predicate
201271 *
0 commit comments