-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathObjectFactoryBuilder.php
97 lines (73 loc) · 2.59 KB
/
ObjectFactoryBuilder.php
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
/*
* This file is part of the Klipper package.
*
* (c) François Pluchino <francois.pluchino@klipper.dev>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Klipper\Component\DefaultValue;
/**
* The default implementation of ObjectFactoryBuilderInterface.
*
* @author François Pluchino <francois.pluchino@klipper.dev>
*/
class ObjectFactoryBuilder implements ObjectFactoryBuilderInterface
{
private ?ResolvedObjectTypeFactoryInterface $resolvedTypeFactory = null;
private array $extensions = [];
private array $types = [];
private array $typeExtensions = [];
public function setResolvedTypeFactory(ResolvedObjectTypeFactoryInterface $resolvedTypeFactory): self
{
$this->resolvedTypeFactory = $resolvedTypeFactory;
return $this;
}
public function addExtension(ObjectExtensionInterface $extension): self
{
$this->extensions[] = $extension;
return $this;
}
public function addExtensions(array $extensions): self
{
$this->extensions = array_merge($this->extensions, $extensions);
return $this;
}
public function addType(ObjectTypeInterface $type): self
{
$this->types[$type->getClass()] = $type;
return $this;
}
public function addTypes(array $types): self
{
/** @var ObjectTypeInterface $type */
foreach ($types as $type) {
$this->types[$type->getClass()] = $type;
}
return $this;
}
public function addTypeExtension(ObjectTypeExtensionInterface $typeExtension): self
{
$this->typeExtensions[$typeExtension->getExtendedType()][] = $typeExtension;
return $this;
}
public function addTypeExtensions(array $typeExtensions): self
{
/** @var ObjectTypeExtensionInterface $typeExtension */
foreach ($typeExtensions as $typeExtension) {
$this->typeExtensions[$typeExtension->getExtendedType()][] = $typeExtension;
}
return $this;
}
public function getObjectFactory(): ObjectFactoryInterface
{
$extensions = $this->extensions;
if (\count($this->types) > 0 || \count($this->typeExtensions) > 0) {
$extensions[] = new PreloadedExtension($this->types, $this->typeExtensions);
}
$resolvedTypeFactory = $this->resolvedTypeFactory ?: new ResolvedObjectTypeFactory();
$registry = new ObjectRegistry($extensions, $resolvedTypeFactory);
return new ObjectFactory($registry, $resolvedTypeFactory);
}
}