====== 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); } }