ElementFactory::element()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 3
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace EaselDrawing\Templates;
4
5
use EaselDrawing\ElementInterface;
6
7
class ElementFactory
8
{
9
    private $builders = [];
10
11
    public function register(string $type, string $builderClass)
12
    {
13
        $type = $this->castType($type);
14
        $implements = class_implements($builderClass);
15
        if (! in_array(ElementBuilderInterface::class, $implements)) {
16
            throw new \InvalidArgumentException(
17
                "Cannot register the class $builderClass since it does not implements " . ElementBuilderInterface::class
18
            );
19
        }
20
        $this->builders[$type] = $builderClass;
21
    }
22
23
    public function builderClass(string $type): string
24
    {
25
        $type = $this->castType($type);
26
        if (! isset($this->builders[$type])) {
27
            throw new \InvalidArgumentException("There are no builder class for type $type");
28
        }
29
        return $this->builders[$type];
30
    }
31
32
    public function has(string $type): bool
33
    {
34
        $type = $this->castType($type);
35
        return (isset($this->builders[$type]));
36
    }
37
38
    public function builder(string $type) : ElementBuilderInterface
39
    {
40
        $builderClass = $this->builderClass($type);
41
        /* @var ElementBuilderInterface $builder */
42
        $builder = call_user_func("$builderClass::create");
43
44
        return $builder;
45
    }
46
47
    public function element(string $type, $data, Template $template): ElementInterface
48
    {
49
        $builder = $this->builder($type);
50
        $builder->configure($data, $template);
51
        return $builder->build();
52
    }
53
54
    private function castType(string $type) : string
55
    {
56
        return strtolower($type);
57
    }
58
}
59