julienmonnerie/kirby/src/Cms/HasMethods.php

81 lines
1.6 KiB
PHP
Raw Normal View History

2022-06-17 17:51:59 +02:00
<?php
namespace Kirby\Cms;
use Kirby\Exception\BadMethodCallException;
/**
* HasMethods
*
* @package Kirby Cms
* @author Bastian Allgeier <bastian@getkirby.com>
* @link https://getkirby.com
* @copyright Bastian Allgeier
* @license https://getkirby.com/license
*/
trait HasMethods
{
2022-08-31 15:02:43 +02:00
/**
* All registered methods
*
* @var array
*/
public static $methods = [];
2022-06-17 17:51:59 +02:00
2022-08-31 15:02:43 +02:00
/**
* Calls a registered method class with the
* passed arguments
*
* @internal
* @param string $method
* @param array $args
* @return mixed
* @throws \Kirby\Exception\BadMethodCallException
*/
public function callMethod(string $method, array $args = [])
{
$closure = $this->getMethod($method);
2022-06-17 17:51:59 +02:00
2022-08-31 15:02:43 +02:00
if ($closure === null) {
throw new BadMethodCallException('The method ' . $method . ' does not exist');
}
2022-06-17 17:51:59 +02:00
2022-08-31 15:02:43 +02:00
return $closure->call($this, ...$args);
}
2022-06-17 17:51:59 +02:00
2022-08-31 15:02:43 +02:00
/**
* Checks if the object has a registered method
*
* @internal
* @param string $method
* @return bool
*/
public function hasMethod(string $method): bool
{
return $this->getMethod($method) !== null;
}
2022-06-17 17:51:59 +02:00
2022-08-31 15:02:43 +02:00
/**
* Returns a registered method by name, either from
* the current class or from a parent class ordered by
* inheritance order (top to bottom)
*
* @param string $method
* @return \Closure|null
*/
protected function getMethod(string $method)
{
if (isset(static::$methods[$method]) === true) {
return static::$methods[$method];
}
2022-06-17 17:51:59 +02:00
2022-08-31 15:02:43 +02:00
foreach (class_parents($this) as $parent) {
if (isset($parent::$methods[$method]) === true) {
return $parent::$methods[$method];
}
}
2022-06-17 17:51:59 +02:00
2022-08-31 15:02:43 +02:00
return null;
}
2022-06-17 17:51:59 +02:00
}