Completed
Push — 0.x ( 69861a...85bde2 )
by Andrew
03:11
created

ModuleLoader::isEnv()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
namespace Cadre\Module;
3
4
use ArrayIterator;
5
use Aura\Di\Container;
6
use Aura\Di\ContainerConfigInterface;
7
8
class ModuleLoader implements ModuleLoaderInterface
9
{
10
    protected $modules = [];
11
    protected $environment;
12
    protected $isResolved = false;
13
    protected $containerConfigs = [];
14
    protected $conflictsWith = [];
15
    protected $replacedWith = [];
16
17 14
    public function __construct(array $modules, $environment = '')
18
    {
19 14
        $this->modules = $modules;
20 14
        $this->environment = $environment;
21 14
    }
22
23 13
    public function define(Container $di)
24
    {
25 13
        $this->resolveDependencies();
26 8
        foreach ($this->containerConfigs as $containerConfig) {
27 8
            if ($containerConfig instanceof ContainerConfigInterface) {
28 8
                $containerConfig->define($di);
29
            }
30
        }
31 8
    }
32
33 8
    public function modify(Container $di)
34
    {
35 8
        $this->resolveDependencies();
36 8
        foreach ($this->containerConfigs as $containerConfig) {
37 8
            if ($containerConfig instanceof ContainerConfigInterface) {
38 8
                $containerConfig->modify($di);
39
            }
40
        }
41 8
    }
42
43 2
    public function loaded($name)
44
    {
45 2
        $this->resolveDependencies();
46 2
        return isset($this->containerConfigs[$name]);
47
    }
48
49 1
    public function isEnv($environment)
50
    {
51 1
        return 0 === strcmp($environment, $this->environment);
52
    }
53
54 13
    protected function resolveDependencies()
55
    {
56 13
        if ($this->isResolved) {
57 8
            return;
58
        }
59
60 13
        $modules = new ArrayIterator($this->modules);
61
62 13
        foreach ($modules as $module) {
63 13
            $module = $this->getModule($module);
64 12
            $name = get_class($module);
65
66 12
            if (isset($this->containerConfigs[$name])) {
67 1
                continue;
68
            }
69
70 12
            if (isset($this->replacedWith[$name])) {
71 1
                continue;
72
            }
73
74 12
            if (isset($this->conflictsWith[$name])) {
75 1
                throw new ConflictingModuleException($name, $this->conflictsWith[$name]);
76
            }
77
78 12
            $this->containerConfigs[$name] = $module;
79
80 12
            $this->resolveRequire($modules, $module);
81 12
            $this->resolveRequireEnv($modules, $module);
82 12
            $this->resolveConflict($module, $name);
83 12
            $this->resolveReplace($module, $name);
84
        }
85
86 8
        $this->isResolved = true;
87 8
    }
88
89 12
    protected function resolveRequire($modules, $module)
90
    {
91 12
        $requiredModules = $module->require();
92 12
        foreach ($requiredModules as $requiredModule) {
93 3
            $modules->append($requiredModule);
94
        }
95 12
    }
96
97 12
    protected function resolveRequireEnv($modules, $module)
98
    {
99 12
        $envMethod = 'require' . str_replace(' ', '', ucwords(
100 12
            strtolower(str_replace('_', ' ', trim($this->environment)))
101
        ));
102 12
        if ('require' !== $envMethod && method_exists($module, $envMethod)) {
103 2
            $requiredModules = $module->$envMethod();
104 2
            foreach ($requiredModules as $requiredModule) {
105 2
                $modules->append($requiredModule);
106
            }
107
        }
108 12
    }
109
110 12
    protected function resolveConflict($module, $name)
111
    {
112 12
        $conflictingModules = $module->conflict();
113 12
        foreach ($conflictingModules as $conflictingModule) {
114 3
            $this->conflictsWith[$conflictingModule] = $name;
115 3
            if (isset($this->containerConfigs[$conflictingModule])) {
116 1
                throw new ConflictingModuleException($conflictingModule, $name);
117
            }
118
        }
119 12
    }
120
121 12
    protected function resolveReplace($module, $name)
122
    {
123 12
        $replacesModules = $module->replace();
124 12
        foreach ($replacesModules as $replacesModule) {
125 3
            if (isset($this->replacedWith[$replacesModule])) {
126 1
                throw new AlreadyReplacedException(
127 1
                    $name,
128 1
                    $replacesModule,
129 1
                    $this->replacedWith[$replacesModule]
130
                );
131
            }
132 3
            if (isset($this->containerConfigs[$replacesModule])) {
133 1
                throw new AlreadyLoadedException(
134 1
                    $name,
135 1
                    'replace',
136 1
                    $replacesModule
137
                );
138
            }
139 2
            $this->replacedWith[$replacesModule] = $name;
140
        }
141 12
    }
142
143 13
    protected function getModule($module)
144
    {
145 13
        if (is_string($module)) {
146 13
            $module = new $module($this);
147
        }
148
149 13
        if (! $module instanceof ModuleInterface) {
150 1
            throw new \InvalidArgumentException(
151 1
                'Modules must implement ModuleInterface'
152
            );
153
        }
154
155 12
        return $module;
156
    }
157
}
158