def do_imitate(self):

		#Debug
		'''
		print('l. 63 Imitater')
		print('self.ImitatingFunction is ',self.ImitatingFunction)
		print('')
		'''

		#Definitions
		ImitatedDoMethodStr=self.ImitatingFunction.__name__
		ImitatedDoStr=ImitatedDoMethodStr[0].upper()+ImitatedDoMethodStr[1:]
		ImitatedDoerStr=Doer.getDoerStrWithDoStr(ImitatedDoStr)

		#Debug
		'''
		print('ImitatedDoMethodStr is ',ImitatedDoMethodStr)
		print('ImitatedDoStr is ',ImitatedDoStr)
		print('ImitatedDoerStr is ',ImitatedDoerStr)
		print('')
		'''

		#Definitions
		ImitatedModule=getattr(SYS,ImitatedDoerStr)
		ImitatedClass=getattr(ImitatedModule,SYS.getClassStrWithNameStr(ImitatedDoerStr))
		ImitatedDoneExecStr=getattr(
			ImitatedClass,
			ImitatedClass.NameStr+'DoneExecStr'
		).replace('def DoerFunction','def ImitaterFunction')

		#Define
		def imitateDo(_InstanceVariable,*_LiargVariablesList,**_KwargVariablesDict):
			
			#Debug
			'''
			print('Imitater l.93 inside of the function imitateDo')
			print('_InstanceVariable is ',_InstanceVariable)
			print('_LiargVariablesList is ',_LiargVariablesList)
			print('_KwargVariablesDict is ',_KwargVariablesDict)
			print('')
			'''

			if len(_KwargVariablesDict)>0:

				#group by
				[ImitatedItemTuplesList,ImitatedNotItemTuplesList]=SYS.groupby(
					lambda __ItemTuple:hasattr(_InstanceVariable,__ItemTuple[0]),
					_KwargVariablesDict.items()
				)

				#Debug
				'''
				print('ImitatedItemTuplesList is ',ImitatedItemTuplesList)
				print('ImitatedNotItemTuplesList is ',ImitatedNotItemTuplesList)
				print('')
				'''

				#set in the instance the corresponding kwarged arguments
				map(	
						lambda __ItemTuple:
						#set direct explicit attributes
						_InstanceVariable.__setattr__(*__ItemTuple),
						ImitatedItemTuplesList
					)

				#Define
				ImitatedKwargDict=dict(ImitatedNotItemTuplesList)

			else:

				#Define
				ImitatedKwargDict={}

			#Init
			ImitatedOutputVariable=None

			#Debug
			'''
			print('l.141 Imitater')
			print('self.ImitatingFunction is ',self.ImitatingFunction)
			print('ImitatedKwargDict is ',ImitatedKwargDict)
			print('')
			'''
			
			#call the imitated function
			if len(ImitatedKwargDict)>0:
				ImitatedOutputVariable=self.ImitatingFunction(
									_InstanceVariable,
									*_LiargVariablesList,
									**ImitatedKwargDict
								)
			else:
				ImitatedOutputVariable=self.ImitatingFunction(
						_InstanceVariable,
						*_LiargVariablesList
						)

			#Check
			if ImitatedClass.DoingGetBool==False:

				#Return 
				return _InstanceVariable
			
			else:

				#Return the 
				return ImitatedOutputVariable

		#Link
		ImitatedFunctionKeyStr='imitate'+ImitatedDoStr+'With'+inspect.getmodule(
			self.ImitatingFunction
					).__name__.split('.')[-1]
		if hasattr(ImitatedClass,ImitatedFunctionKeyStr)==False:
			setattr(ImitatedClass,ImitatedFunctionKeyStr,imitateDo)
		else:

			ImitatedLastInt=sorted(
				map(
					lambda __MethodKeyStr:
					(int)(__MethodKeyStr.split('_')[-1]),
					SYS._filter(
						lambda __KeyStr:
						__KeyStr.startswith(ImitatedFunctionKeyStr),
						ImitatedClass.__dict__.keys()
						)
				)
			)[-1]
			setattr(ImitatedClass,ImitatedFunctionKeyStr+'_'+str(ImitatedLastInt),imitateDo)

		#Add to the ImitatedDoneExecStr
		ImitatedDoneExecStr+='\n\treturn _InstanceVariable.'+ImitatedFunctionKeyStr+'(*_LiargVariablesList,**_KwargVariablesDict)'

		#Debug
		'''
		print('ImitatedDoneExecStr is ')
		print(ImitatedDoneExecStr)
		print('')
		'''
		
		#exec
		six.exec_(ImitatedDoneExecStr)

		#set the name
		locals()['ImitaterFunction'].__name__=self.__class__.NameStr+Doer.DoingDecorationStr+ImitatedDoMethodStr

		#Link
		self.ImitatedFunction=locals()['ImitaterFunction']
	def argument(self,_Variable):

		#debug
		'''
		self.debug(('locals ',locals(),['_Variable']))
		'''

		#set
		if self.ArgumentingFunction==None or _Variable!=None:
			self.ArgumentingFunction=_Variable

		#set the ArgumentingDoStr if not already
		if self.ArgumentingDoStr=="":

			#debug
			'''
			self.debug(('self.',self,['ArgumentingFunction']))
			'''

			#Keep only the last part of the name to avoid the FunctingDecorationStrs
			NameStr=self.ArgumentingFunction.__name__.split(Functer.FunctingDecorationStr)[-1]

			#Then transform into an object VariableStr
			self.ArgumentingDoStr=NameStr[0].upper()+NameStr[1:]
			
		#debug
		'''
		self.debug(('self.',self,['ArgumentingDoStr']))
		'''

		#set the ArgumentedDoingStr
		self.ArgumentedDoingStr=Doer.getDoingStrWithDoneStr(
			Doer.getDoneStrWithDoStr(self.ArgumentingDoStr)
			)

		#Find the Arguments Types
		self.ArgumentedInspectOrderedDict=SYS.getArgumentDictWithFunction(self.ArgumentingFunction)

		#Definition the ArgumentedFunction
		def ArgumentedFunction(_InstanceVariable,*_LiargVariablesList,**_KwargVariablesDict):

			
			#debug
			'''
			self.debug(
						[
							('',locals(),[
											'_LiargVariablesList'
								]),
							('self.',self,[
											'ArgumentingDoStr',
											'ArgumentedDoingStr',
											'ArgumentedInspectOrderedDict'
											])
						]
					)
			'''
			
			#set in the instance the corresponding listed arguments if they are not None
			map(	
					lambda __KeyStr,__Variable:
					_InstanceVariable.__setattr__(__KeyStr,__Variable) 
					if __Variable!=None and hasattr(_InstanceVariable,__KeyStr)
					else None,
					map(
							lambda __InputKeyStr:
							self.ArgumentedDoingStr+ArgumentingStr.join(
								__InputKeyStr.split(ArgumentingStr)[1:]
								),
							self.ArgumentedInspectOrderedDict['InputKeyStrsList'][1:]
					),
					_LiargVariablesList
				)


			#Definition the ArgumentedSetTuplesList
			ArgumentedKwargTuplesList=map(
											lambda __ItemTuple:
											(
												self.ArgumentedDoingStr+ArgumentingStr.join(
												__ItemTuple[0].split(ArgumentingStr)[1:]),
												__ItemTuple[1]
											) if __ItemTuple[0].startswith(ArgumentingStr)
											else __ItemTuple,
											_KwargVariablesDict.items()
										)

			#set in the instance the corresponding kwarged arguments
			map(	
					lambda __ItemTuple:
					#set direct explicit attributes
					_InstanceVariable.__setattr__(*__ItemTuple) 
					if hasattr(_InstanceVariable,__ItemTuple[0])
					else None,
					ArgumentedKwargTuplesList
				)

			#Call the argumenting self.ArgumentingFunction
			return self.ArgumentingFunction(_InstanceVariable,*_LiargVariablesList,**_KwargVariablesDict)

		#set
		self.ArgumentedFunction=ArgumentedFunction

		#Return self
		return self