/** * @param string $userOtp * @return OtpVerification */ public function verify($userOtp) { if ($this->verificationAttemptsMade >= self::MAXIMUM_VERIFICATION_ATTEMPTS) { return OtpVerification::tooManyAttempts(); } $this->verificationAttemptsMade++; if (!is_string($userOtp)) { throw InvalidArgumentException::invalidType('string', 'userOtp', $userOtp); } foreach ($this->otps as $otp) { $verification = $otp->verify($userOtp); if ($verification->didOtpMatch()) { return $verification; } } return OtpVerification::noMatch(); }