====== lmbDelegate и lmbDelegateList ======
WACT классы lmbDelegate и lmbDelegateList используются в Limb для реализации паттерна Observer, например, в ACTIVE_RECORD.
В реализации Observer различают 2 роли:
* Сервер (Observable), который генерит сообщения
* Слушатели или подписчики(Observer), которые подписываются на события сервера.
Класс **lmbDelegate** - это по сути объектная форма вызова метода какого-либо объекта:
$callback = new lmbDelegate($this, 'clearCache');
$server->registerSomeListener($callback);
Если серверу нужно сообщить подписчиков, то создается цепочка делегирования **DelegateList :: invokeChain($list)**, которая последовательно вызывает метод invoke у каждого объекта lmbDelegate (с параметрами или без - зависит от конкретного Observable). Цепочка прерывается в том случае, если какой-либо слушатель возвращает положительное значение. Приведем код из DelegateList по вызову цепочки:
class lmbDelegateList {
function invokeChain(&$list, $args) {
if (is_object($list)) {
return $list->invoke($args);
} else if (is_array($list)) {
foreach(array_keys($list) as $key) {
$result = $list[$key]->invoke($args);
if (!is_null($result)) {
return $result;
}
}
}
}
[...]
}
Сам **invoke** слушателя представляет всего лишь вызов функции **call_user_func_array**:
class Delegate extends BaseDelegate
{
protected $object;
protected $method;
function __construct($object, $method)
{
$this->object = $object;
$this->method = $method;
}
function invoke($args)
{
$this->object = lmbHandle::resolve($this->object);
return call_user_func_array(array($this->object, $this->method), $args);
}
}