public CalendarEntry(
            Tenant tenant,
            CalendarId calendarId,
            CalendarEntryId calendarEntryId,
            string description,
            string location,
            Owner owner,
            DateRange timeSpan,
            Repetition repetition,
            Alarm alarm,
            IEnumerable<Participant> invitees = null)
        {
            AssertionConcern.AssertArgumentNotNull(tenant, "The tenant must be provided.");
            AssertionConcern.AssertArgumentNotNull(calendarId, "The calendar id must be provided.");
            AssertionConcern.AssertArgumentNotNull(calendarEntryId, "The calendar entry id must be provided.");
            AssertionConcern.AssertArgumentNotEmpty(description, "The description must be provided.");
            AssertionConcern.AssertArgumentNotEmpty(location, "The location must be provided.");
            AssertionConcern.AssertArgumentNotNull(owner, "The owner must be provided.");
            AssertionConcern.AssertArgumentNotNull(timeSpan, "The time span must be provided.");
            AssertionConcern.AssertArgumentNotNull(repetition, "The repetition must be provided.");
            AssertionConcern.AssertArgumentNotNull(alarm, "The alarm must be provided.");

            if (repetition.Repeats == RepeatType.DoesNotRepeat)
                repetition = Repetition.DoesNotRepeat(timeSpan.Ends);

            AssertTimeSpans(repetition, timeSpan);

            Apply(new CalendarEntryScheduled(tenant, calendarId, calendarEntryId, description, location, owner, timeSpan, repetition, alarm, invitees));
        }
 void AssertTimeSpans(Repetition repetition, DateRange timeSpan)
 {
     if (repetition.Repeats == RepeatType.DoesNotRepeat)
     {
         AssertionConcern.AssertArgumentEquals(repetition.Ends, timeSpan.Ends, "Non-repeating entry must end with time span end.");
     }
     else
     {
         AssertionConcern.AssertArgumentFalse(timeSpan.Ends > repetition.Ends, "Time span must end when or before repetition ends.");
     }
 }
 void When(CalendarEntryScheduled e)
 {
     this.tenant = e.Tenant;
     this.calendarId = e.CalendarId;
     this.calendarEntryId = e.CalendarEntryId;
     this.description = e.Description;
     this.location = e.Location;
     this.owner = e.Owner;
     this.timeSpan = e.TimeSpan;
     this.repetition = e.Repetition;
     this.alarm = e.Alarm;
     this.invitees = new HashSet<Participant>(e.Invitees ?? Enumerable.Empty<Participant>());
 }
 public CalendarEntryRescheduled(
     Tenant tenant,
     CalendarId calendarId,
     CalendarEntryId calendarEntryId,
     DateRange timeSpan,
     Repetition repetition,
     Alarm alarm)
 {
     this.Tenant = tenant;
     this.CalendarId = calendarId;
     this.CalendarEntryId = calendarEntryId;
     this.TimeSpan = timeSpan;
     this.Repetition = repetition;
     this.Alarm = alarm;
 }
 public CalendarEntry ScheduleCalendarEntry(
     CalendarIdentityService calendarIdService,
     string description,
     string location,
     Owner owner,
     DateRange timeSpan,
     Repetition repetition,
     Alarm alarm,
     IEnumerable<Participant> invitees = null)
 {
     return new CalendarEntry(
         this.tenant,
         this.calendarId,
         calendarIdService.GetNextCalendarEntryId(),
         description,
         location,
         owner,
         timeSpan,
         repetition,
         alarm,
         invitees);
 }
 public CalendarEntryScheduled(
     Tenant tenant, 
     CalendarId calendarId, 
     CalendarEntryId calendarEntryId, 
     string description, 
     string location, 
     Owner owner, 
     DateRange timeSpan, 
     Repetition repetition,
     Alarm alarm,
     IEnumerable<Participant> invitees)
 {
     this.Tenant = tenant;
     this.CalendarId = calendarId;
     this.CalendarEntryId = calendarEntryId;
     this.Description = description;
     this.Location = location;
     this.Owner = owner;
     this.TimeSpan = timeSpan;
     this.Repetition = repetition;
     this.Alarm = alarm;
     this.Invitees = invitees;
 }
 void When(CalendarEntryRescheduled e)
 {
     this.timeSpan = e.TimeSpan;
     this.repetition = e.Repetition;
     this.alarm = e.Alarm;
 }
        public void Reschedule(string description, string location, DateRange timeSpan, Repetition repetition, Alarm alarm)
        {
            AssertionConcern.AssertArgumentNotNull(timeSpan, "The time span must be provided.");
            AssertionConcern.AssertArgumentNotNull(repetition, "The repetition must be provided.");
            AssertionConcern.AssertArgumentNotNull(alarm, "The alarm must be provided.");

            if (repetition.Repeats == RepeatType.DoesNotRepeat)
                repetition = Repetition.DoesNotRepeat(timeSpan.Ends);

            AssertTimeSpans(repetition, timeSpan);

            ChangeDescription(description);
            Relocate(location);

            Apply(new CalendarEntryRescheduled(this.tenant, this.calendarId, this.calendarEntryId, timeSpan, repetition, alarm));
        }