OptionProviderRegistry::providerByClassName()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 7
nc 3
nop 1
dl 0
loc 14
rs 10
c 0
b 0
f 0
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