street !== null; } public function hasCity() : bool { return $this->city !== null; } public function hasCountry() : bool { return $this->country !== null; } public function hasState() : bool { return $this->state !== null; } public function hasPostalCode() : bool { return $this->postalCode !== null; } public function getStreet() : ?string { return $this->street; } public function getCity() : ?string { return $this->city; } public function getCountry() : ?string { return $this->country; } public function getState() : ?string { return $this->state; } public function getPostalCode() : ?string { return $this->postalCode; } public function withStreet(?string $street) : self { $newAddress = self::createBuilder() ->clone($this) ->setStreet($street) ->build(); return $newAddress; } public function withCity(?string $city) : self { $newAddress = self::createBuilder() ->clone($this) ->setCity($city) ->build(); return $newAddress; } public function withCountry(?string $country) : self { $newAddress = self::createBuilder() ->clone($this) ->setCountry($country) ->build(); return $newAddress; } public function withState(?string $state) : self { $newAddress = self::createBuilder() ->clone($this) ->setState($state) ->build(); return $newAddress; } public function withPostalCode(?string $postalCode) : self { $newAddress = self::createBuilder() ->clone($this) ->setPostalCode($postalCode) ->build(); return $newAddress; } public static function fromRaw(array $raw) : self { $obj = new self(); $obj->street = $raw['street'] ?? null; $obj->city = $raw['city'] ?? null; $obj->country = $raw['country'] ?? null; $obj->state = $raw['state'] ?? null; $obj->postalCode = $raw['postalCode'] ?? null; return $obj; } public static function createBuilder() : AddressBuilder { return new AddressBuilder(); } }