public virtual Conference PlanAConference(DateTime conferenceDate, List <string> inputTalkList) { var talkList = _titleDurationSplitter.GetTalkList(inputTalkList); var currentSession = CreateANewTalkSession(conferenceDate); var currentTrack = new Track(conferenceDate); currentTrack.AddASession(currentSession); _conference.AddATrack(currentTrack); var currentSessionTime = currentSession.StartTime; foreach (var talk in talkList) { if (FitTalkIntoTheSession(talk, currentSession, ref currentSessionTime)) { continue; } //couldn't fit into the current session, so create necessary session and track var currentTrackAndSession = AddNecessaryTrackAndSession(currentSession, currentTrack); currentTrack = currentTrackAndSession.Item1; currentSession = currentTrackAndSession.Item2; currentSessionTime = currentSession.StartTime; FitTalkIntoTheSession(talk, currentSession, ref currentSessionTime); } return(_conference); }