/**
  * @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();
 }