Completed
Push — master ( 56a459...0ee720 )
by Randy
03:34
created

ClassMapper::appendPattern()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 2
1
<?php
2
3
namespace Dgame\Soap\Hydrator;
4
5
/**
6
 * Class ClassMapper
7
 * @package Dgame\Soap\Hydrator
8
 */
9
final class ClassMapper
10
{
11
    /**
12
     * @var array
13
     */
14
    private $classmap = [];
15
    /**
16
     * @var array
17
     */
18
    private $pattern = [];
19
20
    /**
21
     * AutoLoad constructor.
22
     *
23
     * @param array $classmap
24
     */
25
    public function __construct(array $classmap = [])
26
    {
27
        $this->classmap = $classmap;
28
    }
29
30
    /**
31
     * @param string $name
32
     * @param string $class
33
     */
34
    public function appendClass(string $name, string $class)
35
    {
36
        $this->classmap[$name] = $class;
37
    }
38
39
    /**
40
     * @param string $pattern
41
     * @param string $class
42
     */
43
    public function appendPattern(string $pattern, string $class)
44
    {
45
        $this->pattern[$pattern] = $class;
46
    }
47
48
    /**
49
     * @param string $class
50
     *
51
     * @return string
52
     */
53
    private function getClass(string $class): string
54
    {
55
        $class = $this->resolvePattern($class) ?? ucfirst($class);
56
        if (array_key_exists($class, $this->classmap)) {
57
            return $this->classmap[$class];
58
        }
59
60
        return $class;
61
    }
62
63
    /**
64
     * @param string $class
65
     *
66
     * @return string|null
67
     */
68
    private function resolvePattern(string $class): ?string
69
    {
70
        foreach ($this->pattern as $pattern => $name) {
71
            if (preg_match($pattern, $class) === 1) {
72
                return $name;
73
            }
74
        }
75
76
        return null;
77
    }
78
79
    /**
80
     * @param string $class
81
     *
82
     * @return HydratableInterface|null
83
     */
84
    public function getInstanceOf(string $class): ?HydratableInterface
85
    {
86
        $class = $this->getClass($class);
87
88
        return class_exists($class) ? new $class() : null;
89
    }
90
}