WACT классы lmbDelegate и lmbDelegateList используются в Limb для реализации паттерна Observer, например, в ACTIVE_RECORD.
В реализации Observer различают 2 роли:
Класс 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); } }