Completed
Push — master ( 939cef...4aee11 )
by Kacper
03:59
created

XmlElementFactory::lookup()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 18
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 5.2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 18
cc 5
eloc 10
nc 5
nop 3
ccs 8
cts 10
cp 0.8
crap 5.2
rs 8.8571
1
<?php
2
/**
3
 * Nucleus - XMPP Library for PHP
4
 *
5
 * Copyright (C) 2016, Some rights reserved.
6
 *
7
 * @author Kacper "Kadet" Donat <[email protected]>
8
 *
9
 * Contact with author:
10
 * Xmpp: [email protected]
11
 * E-mail: [email protected]
12
 *
13
 * From Kadet with love.
14
 */
15
16
namespace Kadet\Xmpp\Xml;
17
18
class XmlElementFactory
19
{
20
    /**
21
     * @var string[string]
22
     */
23
    private $_lookup = ['<predicate>' => ''];
24
    
25 3
    public function lookup($namespace, $tag, $additional = [])
26
    {
27 3
        $lookup = array_merge($this->_lookup, $this->_lookupize($additional));
28
29 3
        if (isset($lookup["$tag@$namespace"])) {
30 1
            return $lookup["$tag@$namespace"];
31 3
        } elseif (isset($lookup[$namespace])) {
32 1
            return $lookup[$namespace];
33
        }
34
35 3
        foreach ($lookup['<predicate>'] as list($class, $predicate)) {
36
            if($predicate($tag, $namespace)) {
37
                return $class;
38
            }
39
        }
40
41 3
        return XmlElement::class;
42
    }
43
44 1
    public function register($class, $namespace, $tag = null)
45
    {
46 1
        $this->_lookup = array_merge($this->_lookup, $this->_lookupize([[$class, 'uri' => $namespace, 'name' => $tag]]));
47 1
    }
48
49
    public function load(array $dictionary)
50
    {
51
        foreach ($dictionary as $element) {
52
            $this->register($element[0], $element['uri'] ?? null, $element['name'] ?? null);
53
        }
54
    }
55
56 3
    public function create($namespace, $tag, $arguments = [], $additional = [])
57
    {
58 3
        $class = $this->lookup($namespace, $tag, $additional);
59
        /** @noinspection PhpUndefinedMethodInspection */
60 3
        return $class::plain(...$arguments);
61
    }
62
63 3
    private function _lookupize(array $dictionary)
64
    {
65 3
        $result = ['<predicate>' => []];
66 3
        foreach ($dictionary as $element) {
67 1
            if($element['name'] instanceof \Closure || $element['uri'] instanceof \Closure) {
68
                $result['<predicate>'][] = [$element[0], \Kadet\Xmpp\Utils\filter\consecutive(
69
                    \Kadet\Xmpp\Utils\filter\predicate($element['name']),
70
                    \Kadet\Xmpp\Utils\filter\predicate($element['uri'])
71
                )];
72
            } else {
73 1
                $result[$this->_name($element['name'] ?? null, $element['uri'] ?? null)] = $element[0];
74
            }
75
        }
76
77 3
        return $result;
78
    }
79
80 1
    private function _name(string $name = null, string $uri = null)
81
    {
82 1
        return $name ? "$name@$uri" : $uri;
83
    }
84
}
85