public Schedule next() {
		// return next schedule and generate the next one
		// if there is none, return null
		if (next == null) return null;
		// current is holding the return value
		final Schedule current = next;
		// clone the old next
		next = (Schedule)next.clone();
		// hold the map
		final Map<String, Integer> schedule = next.getSchedule();
		// starting from the lowest in the order
		for(int i=cachedSortedSectionIds.length - 1; i >= 0; i--) {
			// get current slot #
			int slot = schedule.get(cachedSortedSectionIds[i]);
			// increment the slot #
			slot = (slot+1) % Schedule.SLOTS;
			// move the schedule
			next.move(cachedSortedSectionIds[i], slot);
			// if it gets over, we continue to increment the previous section in order
			if (slot > 0) break;
		}
		// if the end if reached, we quit
		if(next.equals(end))
			next = null;
		return current;
	}