diff --git a/src/Potter/Aware/AbstractAware.php b/src/Potter/Aware/AbstractAware.php index a114e21..c267858 100644 --- a/src/Potter/Aware/AbstractAware.php +++ b/src/Potter/Aware/AbstractAware.php @@ -10,4 +10,5 @@ abstract class AbstractAware implements AwareInterface abstract public function has(string $key): bool; abstract protected function set(string $key, mixed $value): mixed; abstract protected function unset(string $key): void; + abstract public function with(string $key, mixed $value): AwareInterface; } diff --git a/src/Potter/Aware/AwareInterface.php b/src/Potter/Aware/AwareInterface.php index 6e16f57..1f5539f 100644 --- a/src/Potter/Aware/AwareInterface.php +++ b/src/Potter/Aware/AwareInterface.php @@ -8,4 +8,5 @@ interface AwareInterface { public function get(string $key): mixed; public function has(string $key): bool; + public function with(string $key, mixed $value): self; } diff --git a/src/Potter/Aware/AwareTrait.php b/src/Potter/Aware/AwareTrait.php index 547ad50..7ebbb79 100644 --- a/src/Potter/Aware/AwareTrait.php +++ b/src/Potter/Aware/AwareTrait.php @@ -10,6 +10,8 @@ trait AwareTrait { private array $aware = []; + abstract public function clone(): CloneableInterface; + final public function get(string $key): mixed { return $this->aware[$key]; @@ -30,5 +32,9 @@ trait AwareTrait unset($this->aware[$key]); } - abstract public function clone(): CloneableInterface; + final public function with(string $key, mixed $value): AwareInterface + { + ($clone = $this->clone())->set($key, $value); + return $clone; + } }