AbstractComponent::getImplementation()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
namespace Mosaic\Common\Components;
4
5
use InvalidArgumentException;
6
7
abstract class AbstractComponent implements Component
8
{
9
    /**
10
     * @var string
11
     */
12
    protected $implementation;
13
14
    /**
15
     * @var array
16
     */
17
    protected static $custom = [];
18
19
    /**
20
     * @param string $implementation
21
     */
22 5
    protected function __construct(string $implementation)
23
    {
24 5
        $this->setImplementation($implementation);
25 5
    }
26
27
    /**
28
     * @return string
29
     */
30 4
    public function getImplementation() : string
31
    {
32 4
        return $this->implementation;
33
    }
34
35
    /**
36
     * @param string $implementation
37
     */
38 5
    public function setImplementation(string $implementation)
39
    {
40 5
        $this->implementation = $implementation;
41 5
    }
42
43
    /**
44
     * @return array
45
     */
46 3
    public function getProviders() : array
47
    {
48 3
        $method = 'resolve' . ucfirst($this->getImplementation());
49
50 3
        if (isset(static::$custom[$this->getImplementation()])) {
51 1
            return $this->resolveCustom(static::$custom[$this->getImplementation()]);
52
        }
53
54 2
        return call_user_func([$this, $method]);
55
    }
56
57
    /**
58
     * @param  callable $callback
59
     * @return array
60
     */
61
    abstract public function resolveCustom(callable $callback) : array;
62
63
    /**
64
     * @param string   $name
65
     * @param callable $callback
66
     */
67 2
    public static function extend(string $name, callable $callback)
68
    {
69 2
        static::$custom[$name] = $callback;
70 2
    }
71
72
    /**
73
     * @param  string    $name
74
     * @param  array     $arguments
75
     * @return Component
76
     */
77 6
    public static function __callStatic(string $name, array $arguments = []) : Component
78
    {
79 6
        if (!static::hasImplementation($name)) {
80 1
            throw new InvalidArgumentException('Implementation [' . $name . '] does not exist');
81
        }
82
83 5
        return new static($name, ...$arguments);
0 ignored issues
show
Unused Code introduced by
The call to AbstractComponent::__construct() has too many arguments starting with $arguments.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
84
    }
85
86
    /**
87
     * @param  string $name
88
     * @return bool
89
     */
90 6
    protected static function hasImplementation(string $name) : bool
91
    {
92 6
        return isset(static::$custom[$name]) || method_exists(get_called_class(), 'resolve' . ucfirst($name));
93
    }
94
}
95