Completed
Push — master ( 4c0fd5...620079 )
by Antonio Carlos
02:21
created

Macroable   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 106
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Test Coverage

Coverage 78.56%

Importance

Changes 0
Metric Value
dl 0
loc 106
ccs 22
cts 28
cp 0.7856
rs 10
c 0
b 0
f 0
wmc 12
lcom 1
cbo 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A macro() 0 4 1
A mixin() 0 13 4
A hasMacro() 0 4 1
A __callStatic() 0 14 3
A __call() 0 16 3
1
<?php
2
3
namespace IlluminateAgnostic\Arr\Support\Traits;
4
5
use Closure;
6
use ReflectionClass;
7
use ReflectionMethod;
8
use BadMethodCallException;
9
10
trait Macroable
11
{
12
    /**
13
     * The registered string macros.
14
     *
15
     * @var array
16
     */
17
    protected static $macros = [];
18
19
    /**
20
     * Register a custom macro.
21
     *
22
     * @param  string $name
23
     * @param  object|callable  $macro
24
     *
25
     * @return void
26
     */
27 7
    public static function macro($name, $macro)
28
    {
29 7
        static::$macros[$name] = $macro;
30 7
    }
31
32
    /**
33
     * Mix another object into the class.
34
     *
35
     * @param  object  $mixin
36
     * @param  bool  $replace
37
     * @return void
38
     *
39
     * @throws \ReflectionException
40
     */
41 2
    public static function mixin($mixin, $replace = true)
42
    {
43 2
        $methods = (new ReflectionClass($mixin))->getMethods(
44 2
            ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED
45
        );
46
47 2
        foreach ($methods as $method) {
48 2
            if ($replace || ! static::hasMacro($method->name)) {
49 2
                $method->setAccessible(true);
50 2
                static::macro($method->name, $method->invoke($mixin));
0 ignored issues
show
Documentation introduced by
$method->invoke($mixin) is of type *, but the function expects a callable.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
51
            }
52
        }
53 2
    }
54
55
    /**
56
     * Checks if macro is registered.
57
     *
58
     * @param  string  $name
59
     * @return bool
60
     */
61 7
    public static function hasMacro($name)
62
    {
63 7
        return isset(static::$macros[$name]);
64
    }
65
66
    /**
67
     * Dynamically handle calls to the class.
68
     *
69
     * @param  string  $method
70
     * @param  array   $parameters
71
     * @return mixed
72
     *
73
     * @throws \BadMethodCallException
74
     */
75 2
    public static function __callStatic($method, $parameters)
76
    {
77 2
        if (! static::hasMacro($method)) {
78
            throw new BadMethodCallException(sprintf(
79
                'Method %s::%s does not exist.', static::class, $method
80
            ));
81
        }
82
83 2
        if (static::$macros[$method] instanceof Closure) {
84 2
            return call_user_func_array(Closure::bind(static::$macros[$method], null, static::class), $parameters);
85
        }
86
87
        return call_user_func_array(static::$macros[$method], $parameters);
88
    }
89
90
    /**
91
     * Dynamically handle calls to the class.
92
     *
93
     * @param  string  $method
94
     * @param  array   $parameters
95
     * @return mixed
96
     *
97
     * @throws \BadMethodCallException
98
     */
99 6
    public function __call($method, $parameters)
100
    {
101 6
        if (! static::hasMacro($method)) {
102
            throw new BadMethodCallException(sprintf(
103
                'Method %s::%s does not exist.', static::class, $method
104
            ));
105
        }
106
107 6
        $macro = static::$macros[$method];
108
109 6
        if ($macro instanceof Closure) {
110 6
            return call_user_func_array($macro->bindTo($this, static::class), $parameters);
111
        }
112
113
        return call_user_func_array($macro, $parameters);
114
    }
115
}
116