Completed
Push — master ( 02285f...915210 )
by personal
05:27
created

NameResolver::resolve()   C

Complexity

Conditions 7
Paths 8

Size

Total Lines 32
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 1 Features 0
Metric Value
c 5
b 1
f 0
dl 0
loc 32
rs 6.7273
cc 7
eloc 15
nc 8
nop 2
1
<?php
2
3
/*
4
 * (c) Jean-François Lépine <https://twitter.com/Halleck45>
5
 *
6
 * For the full copyright and license information, please view the LICENSE
7
 * file that was distributed with this source code.
8
 */
9
10
namespace Hal\Component\OOP\Resolver;
11
12
13
/**
14
 * Alias (and namepsace) resolver
15
 *
16
 * @author Jean-François Lépine <https://twitter.com/Halleck45>
17
 */
18
class NameResolver
19
{
20
21
    /**
22
     * @var array
23
     */
24
    private $aliases = array();
25
26
    /**
27
     * @var string
28
     */
29
    private $namespace = '\\';
30
31
    /**
32
     * Resolve name of class
33
     *
34
     * @param string $name
35
     * @param string $currentNamespace
36
     * @return string
37
     */
38
    public function resolve($name, $currentNamespace = '\\')
39
    {
40
        // already namespaced
41
        if ('\\' == $name[0]) {
42
            return $name;
43
        }
44
45
        // anonymous class
46
        if('class@anonymous' == $name ) {
47
            return $name;
48
        }
49
50
        // use xxx as yyy
51
        if (isset($this->aliases[$name])) {
52
            return $this->aliases[$name];
53
        }
54
55
        // use xxx;
56
        foreach (array_keys($this->aliases) as $alias) {
57
            $parts = preg_split('![^\w]!', $alias);
58
            $last = $parts[sizeof($parts, COUNT_NORMAL) - 1];
59
            if ($last === $name) {
60
                return $alias;
61
            }
62
        }
63
64
        if ($currentNamespace === null) {
65
            return $name;
66
        }
67
        return rtrim($currentNamespace, '\\').'\\'.$name;
68
69
    }
70
71
    /**
72
     * Push alias
73
     *
74
     * @param \StdClass $alias
75
     * @return $this
76
     */
77
    public function pushAlias(\StdClass $alias) {
78
        $this->aliases[$alias->alias] = $alias->name;
79
        return $this;
80
    }
81
82
    /**
83
     * @return string
84
     */
85
    public function getNamespace()
86
    {
87
        return $this->namespace;
88
    }
89
90
    /**
91
     * @param string $namespace
92
     * @return NameResolver
93
     */
94
    public function setNamespace($namespace)
95
    {
96
        $this->namespace = $namespace;
97
        return $this;
98
    }
99
100
}