ConfigureFactorsPass   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 40
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 5

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 7
lcom 0
cbo 5
dl 0
loc 40
ccs 21
cts 21
cp 1
rs 10
c 0
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
C process() 0 34 7
1
<?php
2
declare(strict_types = 1);
3
4
namespace Innmind\HomeostasisBundle\DependencyInjection\Compiler;
5
6
use Innmind\HomeostasisBundle\Exception\{
7
    MissingAliasAttribute,
8
    AliasNameUsedMultipleTimes
9
};
10
use Innmind\Immutable\Map;
11
use Symfony\Component\DependencyInjection\{
12
    ContainerBuilder,
13
    Compiler\CompilerPassInterface,
14
    Definition,
15
    Reference
16
};
17
18
final class ConfigureFactorsPass implements CompilerPassInterface
19
{
20
    /**
21
     * {@inheritdoc}
22
     */
23 8
    public function process(ContainerBuilder $container)
24
    {
25 8
        $config = $container->getParameter('innmind.homeostasis.factors');
26 8
        $factors = $container->findTaggedServiceIds('innmind.homeostasis.factor');
27 8
        $map = new Map('string', Definition::class);
28
29 8
        foreach ($factors as $id => $tags) {
30 8
            foreach ($tags as $attributes) {
31 8
                if (!isset($attributes['alias'])) {
32 2
                    throw new MissingAliasAttribute($id);
33
                }
34
35 6
                $alias = $attributes['alias'];
36
37 6
                if ($map->contains($alias)) {
38 2
                    throw new AliasNameUsedMultipleTimes($alias);
39
                }
40
41 6
                $map = $map->put($alias, $container->getDefinition($id));
42
            }
43
        }
44
45
        $map
46 4
            ->filter(static function(string $alias, Definition $definition) use ($config): bool {
47 4
                return isset($config[$alias]) &&
48 4
                    is_array($definition->getFactory()) &&
49 4
                    $definition->getFactory()[0] instanceof Reference;
50 4
            })
51 4
            ->foreach(static function(string $alias, Definition $definition) use ($config, $container): void {
52
                $container
53 4
                    ->getDefinition((string) $definition->getFactory()[0])
54 4
                    ->addArgument($config[$alias]);
55 4
            });
56
    }
57
}
58