def METHOD_NAME(self):
	bld = self.generator.bld
	if bld.is_install < 0:
		return SKIP_ME
	for t in self.run_after:
		if not t.hasrun:
			return ASK_LATER
		elif t.hasrun < SKIPPED:
			# a dependency has an error
			return CANCEL_ME
	# first compute the signature
	try:
		new_sig = self.signature()
	except Errors.TaskNotReady:
		return ASK_LATER
	if not self.outputs:
		# compare the signature to a signature computed previously
		# this part is only for tasks with no output files
		key = self.uid()
		try:
			prev_sig = bld.task_sigs[key]
		except KeyError:
			Logs.debug('task: task %r must run: it was never run before or the task code changed', self)
			return RUN_ME
		if new_sig != prev_sig:
			Logs.debug('task: task %r must run: the task signature changed', self)
			return RUN_ME
	# compare the signatures of the outputs to make a decision
	for node in self.outputs:
		try:
			sig = node.h_file()
		except EnvironmentError:
			Logs.debug('task: task %r must run: an output node does not exist', self)
			return RUN_ME
		if sig != new_sig:
			Logs.debug('task: task %r must run: an output node is stale', self)
			return RUN_ME
	return (self.always_run and RUN_ME) or SKIP_ME