@@ -56,7 +56,7 @@ final class ClassType
56
56
/** @var string[] */
57
57
private $ implements = [];
58
58
59
- /** @var array [] */
59
+ /** @var TraitUse [] */
60
60
private $ traits = [];
61
61
62
62
/** @var Constant[] name => Constant */
@@ -330,13 +330,18 @@ public function removeImplement(string $name): self
330
330
331
331
332
332
/**
333
- * @param string[] $names
333
+ * @param string[]|TraitUse[] $traits
334
334
* @return static
335
335
*/
336
- public function setTraits (array $ names ): self
336
+ public function setTraits (array $ traits ): self
337
337
{
338
- $ this ->validateNames ($ names );
339
- $ this ->traits = array_fill_keys ($ names , []);
338
+ $ this ->traits = [];
339
+ foreach ($ traits as $ trait ) {
340
+ if (!$ trait instanceof TraitUse) {
341
+ $ trait = new TraitUse ($ trait );
342
+ }
343
+ $ this ->traits [$ trait ->getName ()] = $ trait ;
344
+ }
340
345
return $ this ;
341
346
}
342
347
@@ -355,11 +360,19 @@ public function getTraitResolutions(): array
355
360
}
356
361
357
362
358
- /** @return static */
359
- public function addTrait (string $ name , array $ resolutions = []): self
363
+ /**
364
+ * @param array|bool $resolutions
365
+ * @return static|TraitUse
366
+ */
367
+ public function addTrait (string $ name , $ resolutions = [])
360
368
{
361
- $ this ->validateNames ([$ name ]);
362
- $ this ->traits [$ name ] = $ resolutions ;
369
+ $ this ->traits [$ name ] = $ trait = new TraitUse ($ name );
370
+ if ($ resolutions === true ) {
371
+ return $ trait ;
372
+ }
373
+ array_map (function ($ item ) use ($ trait ) {
374
+ $ trait ->addResolution ($ item );
375
+ }, $ resolutions );
363
376
return $ this ;
364
377
}
365
378
@@ -373,7 +386,7 @@ public function removeTrait(string $name): self
373
386
374
387
375
388
/**
376
- * @param Method|Property|Constant|EnumCase $member
389
+ * @param Method|Property|Constant|EnumCase|TraitUse $member
377
390
* @return static
378
391
*/
379
392
public function addMember ($ member ): self
@@ -393,8 +406,11 @@ public function addMember($member): self
393
406
} elseif ($ member instanceof EnumCase) {
394
407
$ this ->cases [$ member ->getName ()] = $ member ;
395
408
409
+ } elseif ($ member instanceof TraitUse) {
410
+ $ this ->traits [$ member ->getName ()] = $ member ;
411
+
396
412
} else {
397
- throw new Nette \InvalidArgumentException ('Argument must be Method|Property|Constant|EnumCase. ' );
413
+ throw new Nette \InvalidArgumentException ('Argument must be Method|Property|Constant|EnumCase|TraitUse . ' );
398
414
}
399
415
400
416
return $ this ;
0 commit comments