def postpone(self, record):
		""" Postpone (if required) the given task. The real action is depended on task postpone policy

		:param record: record to postpone
		:return: None
		"""

		maximum_records = self.maximum_records()
		if maximum_records is not None and len(self.__records) >= maximum_records:
			record.task_dropped()
			return

		task_policy = record.policy()
		task_group_id = record.task_group_id()

		if task_policy == WScheduleRecord.PostponePolicy.wait:
			self.__postpone_record(record)

		elif task_policy == WScheduleRecord.PostponePolicy.drop:
			record.task_dropped()

		elif task_policy == WScheduleRecord.PostponePolicy.postpone_first:
			if task_group_id is None:
				self.__postpone_record(record)
			else:
				record_found = None
				for previous_scheduled_record, task_index in self.__search_record(task_group_id):
					if previous_scheduled_record.policy() != task_policy:
						raise RuntimeError('Invalid tasks policies')
					record_found = previous_scheduled_record
					break

				if record_found is not None:
					record.task_dropped()
				else:
					self.__postpone_record(record)

		elif task_policy == WScheduleRecord.PostponePolicy.postpone_last:
			if task_group_id is None:
				self.__postpone_record(record)
			else:
				record_found = None
				for previous_scheduled_record, task_index in self.__search_record(task_group_id):
					if previous_scheduled_record.policy() != task_policy:
						raise RuntimeError('Invalid tasks policies')
					record_found = task_index
					break

				if record_found is not None:
					self.__records.pop(record_found).task_dropped()

				self.__postpone_record(record)
		else:
			raise RuntimeError('Invalid policy spotted')