lmbDelegate и lmbDelegateList

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