/**
  * @param IPresentationSpeaker $speaker
  * @return PresentationSpeakerAcceptedAnnouncementEmailSender
  * @throws Exception
  */
 public function build(IPresentationSpeaker $speaker)
 {
     $has_approved = $speaker->hasApprovedPresentations();
     $has_rejected = $speaker->hasRejectedPresentations();
     $has_alternate = $speaker->hasAlternatePresentations();
     if ($has_approved && !$has_rejected && !$has_alternate) {
         return new PresentationSpeakerAcceptedAnnouncementEmailSender();
     }
     if (!$has_approved && !$has_rejected && $has_alternate) {
         return new PresentationSpeakerAlternateAnnouncementEmailSender();
     }
     if (!$has_approved && $has_rejected && !$has_alternate) {
         return new PresentationSpeakerRejectedAnnouncementEmailSender();
     }
     if ($has_approved && !$has_rejected && $has_alternate) {
         return new PresentationSpeakerAcceptedAlternateAnnouncementEmailSender();
     }
     if ($has_approved && $has_rejected && !$has_alternate) {
         return new PresentationSpeakerAcceptedRejectedAnnouncementEmailSender();
     }
     if (!$has_approved && $has_rejected && $has_alternate) {
         return new PresentationSpeakerAlternateRejectedAnnouncementEmailSender();
     }
     if ($has_approved && $has_rejected && $has_alternate) {
         return new PresentationSpeakerAcceptedAlternateAnnouncementEmailSender();
     }
     return null;
 }