writer = $writer; $this->instrument = $instrument; $this->referenceCounter = $referenceCounter; $this->destructors = $destructors; $this->referenceCounter->acquire(); } public function __destruct() { $this->referenceCounter->release(); } /** * @param callable(ObserverInterface): void $callback */ public function observe(callable $callback): ObservableCallbackInterface { $callback = weaken(closure($callback), $target); $callbackId = $this->writer->registerCallback($callback, $this->instrument); $this->referenceCounter->acquire(); $destructor = null; if ($target) { $destructor = $this->destructors[$target] ??= new ObservableCallbackDestructor($this->writer, $this->referenceCounter); $destructor->callbackIds[$callbackId] = $callbackId; } return new ObservableCallback($this->writer, $this->referenceCounter, $callbackId, $destructor, $target); } }