def clean(self, value):
		"""Clean

		Uses the valid method to check which type the value is, and then calls
		the correct version of clean on that node

		Arguments:
			value {mixed} -- The value to clean

		Returns:
			mixed
		"""

		# If the value is None and it's optional, return as is
		if value is None and self._optional:
			return None

		# Go through each of the nodes
		for i in range(len(self._nodes)):

			# If it's valid
			if self._nodes[i].valid(value):

				# Use it's clean
				return self._nodes[i].clean(value)

		# Something went wrong
		raise ValueError('value', value)