/** * Retrieve listener for object * Creates listener if none exists * @param mixed $object * @param string|array|null $name * @return \observr\State\Listener\AggregateListener */ public function listener($object, $name = null) { $uid = spl_object_hash($object); if (!isset($this->listeners[$uid])) { $this->listeners[$uid] = []; } if (is_null($name)) { return new AggregateListener($this->listeners[$uid]); } if (!is_array($name)) { $name = [$name]; } $listeners = []; foreach ($name as $n) { list($unqualifiedName, $namespace) = StateObserver::parseName((string) $n); $qualifiedName = $unqualifiedName . '.' . $namespace; if (!isset($this->listeners[$uid][$unqualifiedName])) { $listener = new StreamListener($this->notifier, new StateObserver($object, $qualifiedName)); $this->listeners[$uid][$unqualifiedName] = $listener; } $listeners[] = $this->listeners[$uid][$unqualifiedName]; } return new AggregateListener($listeners); }