-
-
Notifications
You must be signed in to change notification settings - Fork 90
Expand file tree
/
Copy pathAttributeGenerator.php
More file actions
82 lines (60 loc) · 2.37 KB
/
AttributeGenerator.php
File metadata and controls
82 lines (60 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
declare(strict_types=1);
namespace Laminas\Code\Generator;
use Laminas\Code\Generator\AttributeGenerator\AttributeAssembler;
use Laminas\Code\Generator\AttributeGenerator\AttributePrototype;
use Laminas\Code\Generator\AttributeGenerator\AttributeWithArgumentsAssembler;
use Laminas\Code\Generator\AttributeGenerator\SimpleAttributeAssembler;
use ReflectionAttribute;
use ReflectionClass;
final class AttributeGenerator implements GeneratorInterface
{
private array $assemblers;
private function __construct(AttributeAssembler ...$assembler)
{
$this->assemblers = $assembler;
}
public function generate(): string
{
$generatedAttributes = array_map(fn(AttributeAssembler $attributeAssembler) => $attributeAssembler->assemble(),
$this->assemblers,
);
return implode(AbstractGenerator::LINE_FEED, $generatedAttributes);
}
public static function fromPrototype(AttributePrototype ...$attributePrototype): self
{
$assemblers = [];
foreach ($attributePrototype as $prototype) {
$assemblers[] = self::negotiateAssembler($prototype);
}
return new self(...$assemblers);
}
public static function fromReflection(ReflectionClass $reflectionClass): self
{
$attributes = $reflectionClass->getAttributes();
$assemblers = [];
foreach ($attributes as $attribute) {
$assembler = self::negotiateAssembler($attribute);
$assemblers[] = $assembler;
}
return new self(...$assemblers);
}
public static function fromArray(array $definitions): self
{
$assemblers = [];
foreach ($definitions as $definition) {
@list($attributeName, $attributeArguments) = $definition;
$prototype = new AttributePrototype($attributeName, $attributeArguments ?? []);
$assemblers[] = self::negotiateAssembler($prototype);
}
return new self(...$assemblers);
}
private static function negotiateAssembler(ReflectionAttribute|AttributePrototype $reflectionPrototype): AttributeAssembler
{
$hasArguments = !empty($reflectionPrototype->getArguments());
if ($hasArguments) {
return new AttributeWithArgumentsAssembler($reflectionPrototype);
}
return new SimpleAttributeAssembler($reflectionPrototype);
}
}