<?phpnamespace Whater\Domain\Zones\Model;use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;use Doctrine\Common\Collections\ArrayCollection;use Doctrine\Common\Collections\Collection;use Ramsey\Uuid\Uuid;use Whater\Domain\Common\Exception\InvalidUUIDException;/** * Class District * * @package Whater\Domain\Zones\Model */class District implements ContainsRecordedEvents{    use EventRecorderCapabilities;    /**     * @var string     */    private $uuid;    /**     * @var string     */    private $slug;    /**     * @var string     */    private $name;    /**     * @var Town     */    private $town;    /**     * @var Collection     */    private $whaterPoints;    /**     * @var \DateTime     */    private $createdAt;    /**     * @var \DateTime     */    private $updatedAt;    /**     * @param string $districtId     * @param Town $town     * @param string $name     * @param string $slug     */    public function __construct(        string $districtId = null,        Town $town,        string $name,        string $slug = null    ) {        try {            $this->uuid = Uuid::fromString($districtId ?: Uuid::uuid4())->toString();        } catch (\InvalidArgumentException $e) {            throw new InvalidUUIDException();        }        $this->town = $town;        $this->slug = $slug;        $this->name = $name;        $this->whaterPoints = new ArrayCollection();        $this->createdAt = new \DateTime();        $this->updatedAt = new \DateTime();    }    public function updateDistrictData(        string $name,        string $slug = null    ) {        $this->name = $name;        $this->slug = $slug;        $this->updatedAt = new \DateTime();    }    /**     * @return string     */    public function id(): string    {        return $this->uuid;    }    /**     * @return string     */    public function name(): string    {        return $this->name;    }    /**     * @return string     */    public function slug(): ?string    {        return $this->slug;    }    /**     * @return Town     */    public function town(): Town    {        return $this->town;    }    /**     * @return Collection     */    public function whaterPoints(): Collection    {        return $this->whaterPoints;    }    /**     * @return  \DateTime     */    public function createdAt(): \DateTime    {        return $this->createdAt;    }    /**     * @return  \DateTime     */    public function updatedAt(): \DateTime    {        return $this->updatedAt;    }    /**     * @return bool     */    public function equals(District $district)    {        return $this->id() === $district->id();    }}