Completed
Push — master ( 81e108...c4b1ee )
by Dmitry
05:02
created

Pool   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 57
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 0
dl 0
loc 57
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A register() 0 19 4
A registerResolver() 0 5 1
B get() 0 19 5
A getMappers() 0 4 1
1
<?php
2
3
namespace Tarantool\Mapper;
4
5
use Exception;
6
7
class Pool
8
{
9
    private $description = [];
10
    private $mappers = [];
11
    private $resolvers = [];
12
13
    public function register($name, $handler)
14
    {
15
        if (array_key_exists($name, $this->description)) {
16
            throw new Exception("Mapper $name was registered");
17
        }
18
19
        if ($handler instanceof Mapper) {
20
            $this->description[$name] = $handler;
21
            $this->mappers[$name] = $handler;
22
            return;
23
        }
24
25
        if (!is_callable($handler)) {
26
            throw new Exception("Invalid $name handler");
27
        }
28
29
        $this->description[$name] = $handler;
30
        return $this;
31
    }
32
33
    public function registerResolver($resolver)
34
    {
35
        $this->resolvers[] = $resolver;
36
        return $this;
37
    }
38
39
    public function get($name)
40
    {
41
        if (array_key_exists($name, $this->mappers)) {
42
            return $this->mappers[$name];
43
        }
44
45
        if (array_key_exists($name, $this->description)) {
46
            return $this->mappers[$name] = call_user_func($this->description[$name]);
47
        }
48
49
        foreach ($this->resolvers as $resolver) {
50
            $mapper = call_user_func($resolver, $name);
51
            if ($mapper) {
52
                return $this->mappers[$name] = $mapper;
53
            }
54
        }
55
56
        throw new Exception("Mapper $name is not registered");
57
    }
58
59
    public function getMappers()
60
    {
61
        return array_values($this->mappers);
62
    }
63
}
64