Completed
Branch dev (374206)
by James Ekow Abaka
06:04
created

EngineRegistry::getEngineInstance()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 9.3554
c 0
b 0
f 0
cc 5
nc 5
nop 1
1
<?php
2
3
4
namespace ntentan\honam;
5
6
7
use ntentan\honam\engines\AbstractEngine;
8
use ntentan\honam\exceptions\TemplateEngineNotFoundException;
9
use ntentan\honam\factories\EngineFactoryInterface;
10
11
class EngineRegistry
12
{
13
    private $engines = [];
14
    private $extensions = [];
15
    private $templateRenderer;
16
17
    public function setTemplateRenderer(TemplateRenderer $templateRenderer)
18
    {
19
        $this->templateRenderer = $templateRenderer;
20
    }
21
22
    public function registerEngine($extensions, $factory)
23
    {
24
        foreach($extensions as $extension) {
25
            $this->extensions[$extension] = $factory;
26
        }
27
    }
28
29
    public function getSupportedExtensions()
30
    {
31
        return array_keys($this->extensions);
32
    }
33
34
    public function getEngineInstance($templateFile) : AbstractEngine
35
    {
36
        foreach($this->extensions as $extension => $factory) {
37
            if($extension == substr($templateFile, -strlen($extension))) {
38
                if(is_a($factory, EngineFactoryInterface::class)) {
39
                    $engine = $factory->create();
40
                } else if (is_callable($factory)) {
41
                    $engine = $factory();
42
                } else {
43
                    throw new FactoryException("There is no factory for creating engines for the {$extension} extension");
44
                }
45
                $engine->setTemplateRenderer($this->templateRenderer);
46
                return $engine;
47
            }
48
        }
49
50
        throw new TemplateEngineNotFoundException("An engine for rendering the {$templateFile} extension was not found.");
51
    }
52
}
53