OptionProviderRegistry   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 25
dl 0
loc 64
rs 10
c 0
b 0
f 0
wmc 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A registerClassName() 0 10 2
A providerByOptionName() 0 7 2
A registerOptionName() 0 10 2
A registerProvider() 0 4 1
A providerByClassName() 0 14 3
1
<?php declare(strict_types=1);
2
3
namespace Cocotte\Console;
4
5
final class OptionProviderRegistry
6
{
7
    /**
8
     * @var OptionProvider[]
9
     */
10
    private $providersByOptionName;
11
    /**
12
     * @var OptionProvider[]
13
     */
14
    private $providersByClassName;
15
16
    public function registerProvider(OptionProvider $optionProvider)
17
    {
18
        $this->registerClassName($optionProvider);
19
        $this->registerOptionName($optionProvider);
20
    }
21
22
    public function providerByOptionName(string $optionName): OptionProvider
23
    {
24
        if (!isset($this->providersByOptionName[$optionName])) {
25
            throw new \Exception(sprintf("Option provider '{$optionName}' is not registered"));
26
        }
27
28
        return $this->providersByOptionName[$optionName];
29
    }
30
31
    public function providerByClassName(string $className): OptionProvider
32
    {
33
        if (!is_subclass_of($className, OptionProvider::class)) {
34
            throw new \Exception(sprintf("Option provider '%s' does not implement '%s'",
35
                    $className,
36
                    OptionProvider::class)
37
            );
38
        }
39
40
        if (!isset($this->providersByClassName[$className])) {
41
            throw new \Exception(sprintf("Option provider '{$className}' is not registered"));
42
        }
43
44
        return $this->providersByClassName[$className];
45
    }
46
47
    private function registerOptionName(OptionProvider $provider)
48
    {
49
        $name = $provider->optionName();
50
51
        if (isset($this->providersByOptionName[$name])) {
52
            throw new \Exception($name." cannot be registered because this name is already ".
53
                "registered with provider ".get_class($this->providersByOptionName[$name]));
54
        }
55
56
        $this->providersByOptionName[$name] = $provider;
57
    }
58
59
    private function registerClassName(OptionProvider $provider)
60
    {
61
        $class = get_class($provider);
62
63
        if (isset($this->providersByClassName[$class])) {
64
            throw new \Exception($class." cannot be registered because this name is already ".
65
                "registered with provider ".get_class($this->providersByClassName[$class]));
66
        }
67
68
        $this->providersByClassName[$class] = $provider;
69
    }
70
71
}
72