<?php
namespace Carbon\Traits;
trait Macro
{
protected static $globalMacros = [];
protected static $globalGenericMacros = [];
public static function macro($name, $macro)
{
static::$globalMacros[$name] = $macro;
}
public static function resetMacros()
{
static::$globalMacros = [];
static::$globalGenericMacros = [];
}
public static function genericMacro($macro, $priority = 0)
{
if (!isset(static::$globalGenericMacros[$priority])) {
static::$globalGenericMacros[$priority] = [];
krsort(static::$globalGenericMacros, SORT_NUMERIC);
}
static::$globalGenericMacros[$priority][] = $macro;
}
public static function mixin($mixin)
{
$methods = (new \ReflectionClass($mixin))->getMethods(
\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED
);
foreach ($methods as $method) {
if ($method->isConstructor() || $method->isDestructor()) {
continue;
}
$method->setAccessible(true);
static::macro($method->name, $method->invoke($mixin));
}
}
public static function hasMacro($name)
{
return isset(static::$globalMacros[$name]);
}
}