/**
  * @param IPresentation $presentation
  * @param string $email
  * @param Member|null $member
  * @param IPresentationSpeaker|null $speaker
  * @return IPresentationSpeaker
  */
 public function addSpeakerByEmailTo(IPresentation $presentation, $email, Member $member = null, IPresentationSpeaker $speaker = null)
 {
     return $this->tx_manager->transaction(function () use($presentation, $email, $member, $speaker) {
         $speaker = !is_null($speaker) ? $speaker : $this->speaker_repository->getByEmail($email);
         if (is_null($speaker) && !is_null($member)) {
             $speaker = $member->getSpeakerProfile();
         }
         if (!is_null($speaker) && !is_null($member) && intval($member->ID) !== intval($speaker->MemberID)) {
             throw new EntityValidationException(sprintf('speaker does not belongs to selected member!'));
         }
         if (!$speaker) {
             // create it
             $speaker = PresentationSpeaker::create();
             $speaker->write();
             if (!is_null($member)) {
                 $speaker->MemberID = $member->ID;
                 $member->addToGroupByCode('speakers');
                 $member->write();
             } else {
                 $speaker->MemberID = 0;
                 $request = $this->speaker_registration_manager->register($speaker, $email);
                 $speaker->RegistrationRequestID = $request->getIdentifier();
             }
             $speaker->write();
         }
         // i am adding other speaker than me
         if (!is_null($member) && intval($member->ID) !== intval(Member::currentUserID()) && !$this->canAddSpeakerOnPresentation($speaker, $presentation)) {
             throw new EntityValidationException(sprintf("You reached the max. allowed # of presentations for speaker %s (%s)", $speaker->getName(), $email));
         }
         if ($speaker->Presentations()->filter('PresentationID', $presentation->ID)->count() > 0 || $presentation->ModeratorID == $speaker->ID) {
             throw new EntityValidationException('Speaker already assigned to this presentation!.');
         }
         // The first one is the moderator.
         if (!$presentation->maxModeratorsReached()) {
             $presentation->ModeratorID = $speaker->ID;
         } else {
             $speaker->Presentations()->add($presentation);
             $speaker->write();
         }
         return $speaker;
     });
 }