123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- <?php
-
- namespace Illuminate\Support\Traits;
-
- use Closure;
- use ReflectionClass;
- use ReflectionMethod;
- use BadMethodCallException;
-
- trait Macroable
- {
- /**
- * The registered string macros.
- *
- * @var array
- */
- protected static $macros = [];
-
- /**
- * Register a custom macro.
- *
- * @param string $name
- * @param object|callable $macro
- *
- * @return void
- */
- public static function macro($name, $macro)
- {
- static::$macros[$name] = $macro;
- }
-
- /**
- * Mix another object into the class.
- *
- * @param object $mixin
- * @return void
- * @throws \ReflectionException
- */
- public static function mixin($mixin)
- {
- $methods = (new ReflectionClass($mixin))->getMethods(
- ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED
- );
-
- foreach ($methods as $method) {
- $method->setAccessible(true);
-
- static::macro($method->name, $method->invoke($mixin));
- }
- }
-
- /**
- * Checks if macro is registered.
- *
- * @param string $name
- * @return bool
- */
- public static function hasMacro($name)
- {
- return isset(static::$macros[$name]);
- }
-
- /**
- * Dynamically handle calls to the class.
- *
- * @param string $method
- * @param array $parameters
- * @return mixed
- *
- * @throws \BadMethodCallException
- */
- public static function __callStatic($method, $parameters)
- {
- if (! static::hasMacro($method)) {
- throw new BadMethodCallException(sprintf(
- 'Method %s::%s does not exist.', static::class, $method
- ));
- }
-
- if (static::$macros[$method] instanceof Closure) {
- return call_user_func_array(Closure::bind(static::$macros[$method], null, static::class), $parameters);
- }
-
- return call_user_func_array(static::$macros[$method], $parameters);
- }
-
- /**
- * Dynamically handle calls to the class.
- *
- * @param string $method
- * @param array $parameters
- * @return mixed
- *
- * @throws \BadMethodCallException
- */
- public function __call($method, $parameters)
- {
- if (! static::hasMacro($method)) {
- throw new BadMethodCallException(sprintf(
- 'Method %s::%s does not exist.', static::class, $method
- ));
- }
-
- $macro = static::$macros[$method];
-
- if ($macro instanceof Closure) {
- return call_user_func_array($macro->bindTo($this, static::class), $parameters);
- }
-
- return call_user_func_array($macro, $parameters);
- }
- }
|