*/ private array $options; /** * @param array $options */ private function __construct(array $options) { $this->options = $options; } /** * Create from an associative array. * * @param array $options */ public static function fromAssoc(array $options): self { return new self($options); } /** * Get an option value. Returns `null` if not set. */ public function get(string $option): mixed { return $this->options[$option] ?? null; } /** * Whether an option is set. */ public function has(string $option): bool { return array_key_exists($option, $this->options); } /** * Clone with an option value. */ public function with(string $option, mixed $value): self { $obj = clone $this; $obj->options[$option] = $value; return $obj; } /** * Clone with an option removed. */ public function without(string $option): self { $obj = clone $this; unset($obj->options[$option]); return $obj; } /** * @return array */ public function toAssoc(): array { return $this->options; } }