Macroable::hasMacro()   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 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
3
/*
4
 * This file is part of the light/traits.
5
 *
6
 * (c) lichunqiang <[email protected]>
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.
10
 */
11
12
namespace Light\Traits\Support;
13
14
use BadMethodCallException;
15
use Closure;
16
17
trait Macroable
18
{
19
    /**
20
     * The registered string  macros.
21
     *
22
     * @var array
23
     */
24
    protected static $macros = [];
25
26
    /**
27
     * Register a custom macro.
28
     *
29
     * @param string   $name
30
     * @param callable $macro
31
     */
32 4
    public static function macro($name, callable $macro)
33
    {
34 4
        static::$macros[$name] = $macro;
35 4
    }
36
37
    /**
38
     * Check if macro is registered.
39
     *
40
     * @param string $name
41
     *
42
     * @return bool
43
     */
44 4
    public static function hasMacro($name)
45
    {
46 4
        return isset(static::$macros[$name]);
47
    }
48
49
    /**
50
     * Dynamically handle calls to the class.
51
     *
52
     * @param string $method
53
     * @param array  $arguments
54
     *
55
     * @throws \BadMethodCallException
56
     *
57
     * @return mixed
58
     */
59 3
    public static function __callStatic($method, $arguments)
60
    {
61 3
        if (!static::hasMacro($method)) {
62 1
            throw new BadMethodCallException("Method {$method} does not exists.");
63
        }
64
65 2
        if (static::$macros[$method] instanceof Closure) {
66
            //http://php.net/manual/en/closure.bind.php
67 1
            return call_user_func_array(Closure::bind(static::$macros[$method], null, static::class), $arguments);
68
        }
69
70 1
        return call_user_func_array(static::$macros[$method], $arguments);
71
    }
72
73
    /**
74
     * Dynamically  handle calls to the class.
75
     *
76
     * @param $name
77
     * @param $arguments
78
     *
79
     * @throws \BadMethodCallException
80
     *
81
     * @return mixed
82
     */
83 1
    public function __call($name, $arguments)
84
    {
85 1
        if (!static::hasMacro($name)) {
86
            throw new BadMethodCallException("Method {$name} does not exists.");
87
        }
88
89 1
        if (static::$macros[$name] instanceof Closure) {
90
            //http://php.net/manual/en/closure.bind.php
91 1
            return call_user_func_array(static::$macros[$name]->bindTo($this, static::class), $arguments);
92
        }
93
94 1
        return call_user_func_array(static::$macros[$name], $arguments);
95
    }
96
}
97