/// <summary>
        /// Try to assign a camper to existing blocks of the activity.
        /// </summary>
        /// <param name="camper">Camper to assign</param>
        /// <param name="limitByOptimal">Do not exceed optimal capacity</param>
        /// <returns>true if the camper was assigned</returns>
        public bool TryAssignCamperToExistingActivityBlock(Camper camper, Boolean limitByOptimal)
        {
            bool didAssign = false;

            int capacity      = (limitByOptimal) ? OptimalCapacity : MaximumCapacity;
            var firstFitBlock = _scheduledBlocks.Find(
                b => camper.IsAvailableInTimeSlot(b.TimeSlot) &&
                b.AssignedCampers.Count < capacity);

            if (firstFitBlock != null)
            {
                // If this assign fails something is wrong because it was checked in the find.
                didAssign = camper.TryAssignBlock(firstFitBlock);
            }

            return(didAssign);
        }
        /// <summary>
        /// Try to assign the camper to a new activity block for the activity.
        /// </summary>
        /// <param name="camper">Camper to assign</param>
        /// <param name="activityDefinition">Activity to assign to</param>
        /// <returns>true if the camper was assigned</returns>
        public bool TryAssignCamperToNewActivityBlock(Camper camper)
        {
            // Go through the campers unused slots and try to create to create
            // an activity block.
            Boolean didAssignCamper = false;

            for (int slotNumber = 0; slotNumber < ActivityBlock.MaximumTimeSlots && !didAssignCamper; slotNumber++)
            {
                if (camper.IsAvailableInTimeSlot(slotNumber))
                {
                    var newActivityBlock = TryCreateBlock(slotNumber);
                    didAssignCamper = camper.TryAssignBlock(newActivityBlock);
                }
            }

            return(didAssignCamper);
        }