callbacks)[0]; } /** * Invoke the deferred callbacks. * * @return void */ public function invoke(): void { $this->invokeWhen(fn () => true); } /** * Invoke the deferred callbacks if the given truth test evaluates to true. * * @param \Closure|null $when * @return void */ public function invokeWhen(?Closure $when = null): void { $when ??= fn () => true; $this->forgetDuplicates(); foreach ($this->callbacks as $index => $callback) { if ($when($callback)) { rescue($callback); } unset($this->callbacks[$index]); } } /** * Remove any deferred callbacks with the given name. * * @param string $name * @return void */ public function forget(string $name): void { $this->callbacks = (new Collection($this->callbacks)) ->reject(fn ($callback) => $callback->name === $name) ->values() ->all(); } /** * Remove any duplicate callbacks. * * @return $this */ protected function forgetDuplicates(): self { $this->callbacks = (new Collection($this->callbacks)) ->reverse() ->unique(fn ($c) => $c->name) ->reverse() ->values() ->all(); return $this; } /** * Determine if the collection has a callback with the given key. * * @param mixed $offset * @return bool */ public function offsetExists(mixed $offset): bool { $this->forgetDuplicates(); return isset($this->callbacks[$offset]); } /** * Get the callback with the given key. * * @param mixed $offset * @return mixed */ public function offsetGet(mixed $offset): mixed { $this->forgetDuplicates(); return $this->callbacks[$offset]; } /** * Set the callback with the given key. * * @param mixed $offset * @param mixed $value * @return void */ public function offsetSet(mixed $offset, mixed $value): void { if (is_null($offset)) { $this->callbacks[] = $value; } else { $this->callbacks[$offset] = $value; } } /** * Remove the callback with the given key from the collection. * * @param mixed $offset * @return void */ public function offsetUnset(mixed $offset): void { $this->forgetDuplicates(); unset($this->callbacks[$offset]); } /** * Determine how many callbacks are in the collection. * * @return int */ public function count(): int { $this->forgetDuplicates(); return count($this->callbacks); } }