* * @template T of UserEmail */ interface UserEmailRepository { /** * @return DomainCollection */ public function findAllByUserId(UserId $userId, int $offset = 0, int $limit = 0): DomainCollection; /** * @return T */ public function find(string $email): UserEmail; public function exists(string $email): bool; /** * @param T $userEmail */ public function save(UserEmail $userEmail): void; /** * @param T $userEmail */ public function delete(UserEmail $userEmail): void; }