#pragma once

/////////////////////////////////////////////////////////////
//  Externs binding must use these macro

// This macro is duplicated in VSL projet,
// because we don't want to provide VSL src in the SDK
#define NODEFAULT								nodefault

#define STARTVSLBIND(context)					using namespace VSL; \
												VSLManager *VSLM = (VSLManager *)context->GetManagerByGuid(VSLMANAGER_GUID); \
												if (VSLM) { VSLM->RegisterSpace();
#define STOPVSLBIND								}
#define REGISTERVSLGUID(iGUID, iClassName)		VSLM->RegisterGUID(iGUID, iClassName);

/////////////////////////////////////////////////////////////
// Type Declaration
// TODO : 3 param = alias type::RawName()

// Special class option for CKObjects 
#ifndef VCLASSOPTION_USERDATA
	#define VCLASSOPTION_USERDATA(x)	((x << 24) & 0xFF000000)
#endif
#define VCLASSOPTION_CKOBJECT		VCLASSOPTION_USERDATA(1)
#define VCLASSOPTION_PINBYPOINTER	VCLASSOPTION_USERDATA(2)

#define DECLARETYPE(type)								VSLM->RegisterClass(#type, sizeof(type)); 
#define DECLARETYPEALIAS(type,alias)					VSLM->RegisterClass(#type, sizeof(type), alias); 
#define DECLARETYPEWITHREF(type,ref)					VSLM->RegisterClass(#type, ref); 
#define DECLARETYPEALIASWITHREF(type,ref,alias)			VSLM->RegisterClass(#type, ref, alias);

#if defined(_DEBUG) && !defined(VIRTOOLS_USER_SDK)
	#define DECLAREDOCSDKLINK(type,link)				VSLM->RegisterClassDocSDKLink(#type, link);
#else
	#define DECLAREDOCSDKLINK(type,link)
#endif

#define DECLAREPOINTERTYPE(type)						VSLM->RegisterClass(#type, sizeof(type), NULL, VCLASSOPTION_POINTERCOPY);
#define DECLAREPOINTERTYPEALIAS(type,alias)				VSLM->RegisterClass(#type, sizeof(type), alias, VCLASSOPTION_POINTERCOPY);
#define DECLARECKOBJECTTYPEALIAS(type,alias)			VSLM->RegisterClass(#type, sizeof(type), alias, VCLASSOPTION_POINTERCOPY|VCLASSOPTION_CKOBJECT);

#define DECLAREOBJECTTYPE(type)							VSLM->RegisterClass(#type, sizeof(type), NULL, VCLASSOPTION_MEMCOPY);
#define DECLAREOBJECTTYPEALIAS(type,alias)				VSLM->RegisterClass(#type, sizeof(type), alias, VCLASSOPTION_MEMCOPY); 
#define DECLAREOBJECTTYPEALIAS_PINBYPOINTER(type,alias)	VSLM->RegisterClass(#type, sizeof(type), alias, VCLASSOPTION_MEMCOPY|VCLASSOPTION_PINBYPOINTER); 

#define DECLAREINHERITANCESIMPLE(a,b)	VSLM->RegisterHeritage(a,b,0);
#define DECLAREINHERITANCEDOUBLE(a,b,c)	VSLM->RegisterHeritage(a,b,c,0);

#define REGISTERCONST(name,type,data)	VSLM->RegisterConstant(name,type,data);

///////////////////////////////////////////////////////////////////
// Enum

#define DECLAREENUM(enumName)						VSLM->RegisterEnum(enumName);
#define DECLAREENUMVALUE(enumName,valueName,value)	VSLM->RegisterEnumMember(enumName,valueName,value);

///////////////////////////////////////////////////////////////////
// Enum

enum BindedConstType
{
	BIND_BOOL,
	BIND_CHAR,
	BIND_INT,
	BIND_FLOAT
};

#define DECLARECONST(constName,constType,value)		VSLM->RegisterConstant(constName,constType,value);

///////////////////////////////////////////////////////////////////
// Member Declaration

#if defined(macintosh) || defined(PSX2) || defined(PSP) || (_XBOX_VER>=200)

#define DECLAREMEMBER(classe,mtype,member) { \
	classe* instance = NULL; \
	int offset = (int) &(instance->member); \
	XASSERT((offset + sizeof(mtype)) <= sizeof(classe)); \
	VSLM->RegisterMember(#classe,#member,#mtype, offset);\
}

#else

#define DECLAREMEMBER(classe,mtype,member) { \
	typedef mtype (classe::*mptr); \
	mptr var = (mptr)(&classe::member); \
	void* ptr = (void*)*(DWORD*)&var; \
	VSLM->RegisterMember(#classe,#member,#mtype,(int)ptr);\
}

#endif


/////////////////////////////////////////////////////////////
// function Declaration

#define DECLAREFUN_0(ret,func,callconv) {\
	typedef ret (*fptr)(); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,0,#ret);\
}
#define DECLAREFUN_C_0(ret,func) DECLAREFUN_0(ret,func,VCALLTYPE_CDECL)
#define DECLAREFUN_S_0(ret,func) DECLAREFUN_0(ret,func,VCALLTYPE_STDCALL)

#define DECLAREFUN_1(ret,func,arg1,callconv) {\
	typedef ret (*fptr)(arg1); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,1,#ret,#arg1);\
}

#define DECLAREFUN_1_WITH_DEF_VALS(ret,func,arg1,defVal1,callconv) {\
	typedef ret (*fptr)(arg1); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,1,#ret,#arg1" = "#defVal1);\
}

#define DECLAREFUN_C_1(ret,func,arg1) DECLAREFUN_1(ret,func,arg1,VCALLTYPE_CDECL)
#define DECLAREFUN_S_1(ret,func,arg1) DECLAREFUN_1(ret,func,arg1,VCALLTYPE_STDCALL)
#define DECLAREFUN_C_1_WITH_DEF_VALS(ret,func,arg1,defVal1) DECLAREFUN_1_WITH_DEF_VALS(ret,func,arg1,defVal1,VCALLTYPE_CDECL)
#define DECLAREFUN_S_1_WITH_DEF_VALS(ret,func,arg1,defVal1) DECLAREFUN_1_WITH_DEF_VALS(ret,func,arg1,defVal1,VCALLTYPE_STDCALL)

#define DECLAREFUN_2(ret,func,arg1,arg2,callconv) { \
	typedef ret (*fptr)(arg1,arg2); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,2,#ret,#arg1,#arg2); \
}

#define DECLAREFUN_2_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,callconv) { \
	typedef ret (*fptr)(arg1,arg2); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,2,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2); \
}

#define DECLAREFUN_C_2(ret,func,arg1,arg2) DECLAREFUN_2(ret,func,arg1,arg2,VCALLTYPE_CDECL)
#define DECLAREFUN_S_2(ret,func,arg1,arg2) DECLAREFUN_2(ret,func,arg1,arg2,VCALLTYPE_STDCALL)
#define DECLAREFUN_C_2_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2) DECLAREFUN_2_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,VCALLTYPE_CDECL)
#define DECLAREFUN_S_2_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2) DECLAREFUN_2_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,VCALLTYPE_STDCALL)

#define DECLAREFUN_3(ret,func,arg1,arg2,arg3,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,3,#ret,#arg1,#arg2,#arg3);\
}

#define DECLAREFUN_3_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,3,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3);\
}

#define DECLAREFUN_C_3(ret,func,arg1,arg2,arg3) DECLAREFUN_3(ret,func,arg1,arg2,arg3,VCALLTYPE_CDECL)
#define DECLAREFUN_S_3(ret,func,arg1,arg2,arg3) DECLAREFUN_3(ret,func,arg1,arg2,arg3,VCALLTYPE_STDCALL)
#define DECLAREFUN_C_3_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3) DECLAREFUN_3_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,VCALLTYPE_CDECL)
#define DECLAREFUN_S_3_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3) DECLAREFUN_3_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,VCALLTYPE_STDCALL)

#define DECLAREFUN_4(ret,func,arg1,arg2,arg3,arg4,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3,arg4); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,4,#ret,#arg1,#arg2,#arg3,#arg4);\
}

#define DECLAREFUN_4_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3,arg4); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,4,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4);\
}

#define DECLAREFUN_C_4(ret,func,arg1,arg2,arg3,arg4) DECLAREFUN_4(ret,func,arg1,arg2,arg3,arg4,VCALLTYPE_CDECL)
#define DECLAREFUN_S_4(ret,func,arg1,arg2,arg3,arg4) DECLAREFUN_4(ret,func,arg1,arg2,arg3,arg4,VCALLTYPE_STDCALL)
#define DECLAREFUN_C_4_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4) DECLAREFUN_4_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,VCALLTYPE_CDECL)
#define DECLAREFUN_S_4_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4) DECLAREFUN_4_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,VCALLTYPE_STDCALL)

#define DECLAREFUN_5(ret,func,arg1,arg2,arg3,arg4,arg5,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,5,#ret,#arg1,#arg2,#arg3,#arg4,#arg5);\
}

#define DECLAREFUN_5_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,5,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5);\
}

#define DECLAREFUN_C_5(ret,func,arg1,arg2,arg3,arg4,arg5) DECLAREFUN_5(ret,func,arg1,arg2,arg3,arg4,arg5,VCALLTYPE_CDECL)
#define DECLAREFUN_S_5(ret,func,arg1,arg2,arg3,arg4,arg5) DECLAREFUN_5(ret,func,arg1,arg2,arg3,arg4,arg5,VCALLTYPE_STDCALL)
#define DECLAREFUN_C_5_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5) DECLAREFUN_5_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,VCALLTYPE_CDECL)
#define DECLAREFUN_S_5_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5) DECLAREFUN_5_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,VCALLTYPE_STDCALL)

#define DECLAREFUN_6(ret,func,arg1,arg2,arg3,arg4,arg5,arg6,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,6,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6);\
}

#define DECLAREFUN_6_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,6,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6);\
}

#define DECLAREFUN_C_6(ret,func,arg1,arg2,arg3,arg4,arg5,arg6) DECLAREFUN_6(ret,func,arg1,arg2,arg3,arg4,arg5,arg6,VCALLTYPE_CDECL)
#define DECLAREFUN_S_6(ret,func,arg1,arg2,arg3,arg4,arg5,arg6) DECLAREFUN_6(ret,func,arg1,arg2,arg3,arg4,arg5,arg6,VCALLTYPE_STDCALL)
#define DECLAREFUN_C_6_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6) DECLAREFUN_6_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,VCALLTYPE_CDECL)
#define DECLAREFUN_S_6_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6) DECLAREFUN_6_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,VCALLTYPE_STDCALL)

///////////////////////////////////////////////////////////////////
// Function Declaration with a different name

#define DECLAREFUNALIAS_0(name,ret,func,callconv) {\
	typedef ret (*fptr)(); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(name,ptr,callconv,0,#ret); \
}

#define DECLAREFUNALIAS_C_0(name,ret,func) DECLAREFUNALIAS_0(name,ret,func,(VSL::VCallType)(VCALLTYPE_CDECL|VCALLTYPE_ALIAS))
#define DECLAREFUNALIAS_S_0(name,ret,func) DECLAREFUNALIAS_0(name,ret,func,(VSL::VCallType)(VCALLTYPE_STDCALL|VCALLTYPE_ALIAS))

#define DECLAREFUNALIAS_1(name,ret,func,arg1,callconv) {\
	typedef ret (*fptr)(arg1); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(name,ptr,callconv,1,#ret,#arg1);\
}
#define DECLAREFUNALIAS_C_1(name,ret,func,arg1) DECLAREFUNALIAS_1(name,ret,func,arg1,(VSL::VCallType)(VCALLTYPE_CDECL|VCALLTYPE_ALIAS))
#define DECLAREFUNALIAS_S_1(name,ret,func,arg1) DECLAREFUNALIAS_1(name,ret,func,arg1,(VSL::VCallType)(VCALLTYPE_STDCALL|VCALLTYPE_ALIAS))

#define DECLAREFUNALIAS_2(name,ret,func,arg1,arg2,callconv) {\
	typedef ret (*fptr)(arg1,arg2); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(name,ptr,callconv,2,#ret,#arg1,#arg2);\
}
#define DECLAREFUNALIAS_C_2(name,ret,func,arg1,arg2) DECLAREFUNALIAS_2(name,ret,func,arg1,arg2,(VSL::VCallType)(VCALLTYPE_CDECL|VCALLTYPE_ALIAS))
#define DECLAREFUNALIAS_S_2(name,ret,func,arg1,arg2) DECLAREFUNALIAS_2(name,ret,func,arg1,arg2,(VSL::VCallType)(VCALLTYPE_STDCALL|VCALLTYPE_ALIAS))

#define DECLAREFUNALIAS_3(name,ret,func,arg1,arg2,arg3,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(name,ptr,callconv,3,#ret,#arg1,#arg2,#arg3);\
}
#define DECLAREFUNALIAS_C_3(name,ret,func,arg1,arg2,arg3) DECLAREFUNALIAS_3(name,ret,func,arg1,arg2,arg3,(VSL::VCallType)(VCALLTYPE_CDECL|VCALLTYPE_ALIAS))
#define DECLAREFUNALIAS_S_3(name,ret,func,arg1,arg2,arg3) DECLAREFUNALIAS_3(name,ret,func,arg1,arg2,arg3,(VSL::VCallType)(VCALLTYPE_STDCALL|VCALLTYPE_ALIAS))

#define DECLAREFUNALIAS_4(name,ret,func,arg1,arg2,arg3,arg4,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3,arg4); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(name,ptr,callconv,4,#ret,#arg1,#arg2,#arg3,#arg4);\
}
#define DECLAREFUNALIAS_C_4(name,ret,func,arg1,arg2,arg3,arg4) DECLAREFUNALIAS_4(name,ret,func,arg1,arg2,arg3,arg4,(VSL::VCallType)(VCALLTYPE_CDECL|VCALLTYPE_ALIAS))
#define DECLAREFUNALIAS_S_4(name,ret,func,arg1,arg2,arg3,arg4) DECLAREFUNALIAS_4(name,ret,func,arg1,arg2,arg3,arg4,(VSL::VCallType)(VCALLTYPE_STDCALL|VCALLTYPE_ALIAS))

#define DECLAREFUNALIAS_5(name,ret,func,arg1,arg2,arg3,arg4,arg5,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(name,(fptr)ptr,callconv,4,#ret,#arg1,#arg2,#arg3,#arg4,arg5);\
}
#define DECLAREFUNALIAS_C_5(name,ret,func,arg1,arg2,arg3,arg4,arg5) DECLAREFUNALIAS_5(name,ret,func,arg1,arg2,arg3,arg4,arg5,(VSL::VCallType)(VCALLTYPE_CDECL|VCALLTYPE_ALIAS))
#define DECLAREFUNALIAS_S_5(name,ret,func,arg1,arg2,arg3,arg4,arg5) DECLAREFUNALIAS_5(name,ret,func,arg1,arg2,arg3,arg4,arg5,(VSL::VCallType)(VCALLTYPE_STDCALL|VCALLTYPE_ALIAS))

#define DECLAREFUNALIAS_6(name,ret,func,arg1,arg2,arg3,arg4,arg5,arg6,callconv) {\
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(name,ptr,callconv,4,#ret,#arg1,#arg2,#arg3,#arg4,arg5,arg6);\
}
#define DECLAREFUNALIAS_C_6(name,ret,func,arg1,arg2,arg3,arg4,arg5,arg6) DECLAREFUNALIAS_6(name,ret,func,arg1,arg2,arg3,arg4,arg5,arg6,(VSL::VCallType)(VCALLTYPE_CDECL|VCALLTYPE_ALIAS))
#define DECLAREFUNALIAS_S_6(name,ret,func,arg1,arg2,arg3,arg4,arg5,arg6) DECLAREFUNALIAS_6(name,ret,func,arg1,arg2,arg3,arg4,arg5,arg6,(VSL::VCallType)(VCALLTYPE_STDCALL|VCALLTYPE_ALIAS))

///////////////////////////////////////////////////////////////////
// constructor Declaration

#define DECLARENEW_0(ret,func,callconv) {\
	typedef ret (*fptr)(BYTE*); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,0,#ret);\
}
#define DECLARECTOR_0(func) DECLARENEW_0(void,func,VCALLTYPE_CDECL)

#define DECLARENEW_1(ret,func,arg1,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,1,#ret,#arg1);\
}
#define DECLARECTOR_1(func,arg1) DECLARENEW_1(void,func,arg1,VCALLTYPE_CDECL)

#define DECLARENEW_2(ret,func,arg1,arg2,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,2,#ret,#arg1,#arg2);\
}
#define DECLARECTOR_2(func,arg1,arg2) DECLARENEW_2(void,func,arg1,arg2,VCALLTYPE_CDECL)

#define DECLARENEW_3(ret,func,arg1,arg2,arg3,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,3,#ret,#arg1,#arg2,#arg3);\
}


#define DECLARECTOR_3(func,arg1,arg2,arg3) DECLARENEW_3(void,func,arg1,arg2,arg3,VCALLTYPE_CDECL)

#define DECLARENEW_4(ret,func,arg1,arg2,arg3,arg4,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3,arg4); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,4,#ret,#arg1,#arg2,#arg3,#arg4);\
	}
#define DECLARECTOR_4(func,arg1,arg2,arg3,arg4) DECLARENEW_4(void,func,arg1,arg2,arg3,arg4,VCALLTYPE_CDECL)

#define DECLARENEW_5(ret,func,arg1,arg2,arg3,arg4,arg5,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3,arg4,arg5); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,4,#ret,#arg1,#arg2,#arg3,#arg4,arg5);\
	}
#define DECLARECTOR_5(func,arg1,arg2,arg3,arg4,arg5) DECLARENEW_5(void,func,arg1,arg2,arg3,arg4,arg5,VCALLTYPE_CDECL)

#define DECLARENEW_6(ret,func,arg1,arg2,arg3,arg4,arg5,arg6,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3,arg4,arg5,arg6); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,4,#ret,#arg1,#arg2,#arg3,#arg4,arg5,arg6);\
	}
#define DECLARECTOR_6(func,arg1,arg2,arg3,arg4,arg5,arg6) DECLARENEW_6(void,func,arg1,arg2,arg3,arg4,arg5,arg6,VCALLTYPE_CDECL)

#define DECLARENEW_7(ret,func,arg1,arg2,arg3,arg4,arg5,arg6,arg7,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3,arg4,arg5,arg6,arg7); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,4,#ret,#arg1,#arg2,#arg3,#arg4,arg5,arg6,arg7);\
	}
#define DECLARECTOR_7(func,arg1,arg2,arg3,arg4,arg5,arg6,arg7) DECLARENEW_7(void,func,arg1,arg2,arg3,arg4,arg5,arg6,arg7,VCALLTYPE_CDECL)

#define DECLARENEW_8(ret,func,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,8,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6,#arg7,#arg8);\
	}
#define DECLARECTOR_8(func,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) DECLARENEW_8(void,func,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,VCALLTYPE_CDECL)

// With Def Values

#define DECLARENEW_1_WITH_DEF_VALS(ret,func,arg1,defVal1,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,1,#ret,#arg1" = "#defVal1);\
}
#define DECLARECTOR_1_WITH_DEF_VALS(func,arg1) DECLARENEW_1_WITH_DEF_VALS(void,func,arg1,defVal1,VCALLTYPE_CDECL)

#define DECLARENEW_2_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,2,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2);\
}
#define DECLARECTOR_2_WITH_DEF_VALS(func,arg1,defVal1,arg2,defVal2) DECLARENEW_2_WITH_DEF_VALS(void,func,arg1,defVal1,arg2,defVal2,VCALLTYPE_CDECL)

#define DECLARENEW_3_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,3,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3);\
}
#define DECLARECTOR_3_WITH_DEF_VALS(func,arg1,defVal1,arg2,defVal2,arg3,defVal3) DECLARENEW_3_WITH_DEF_VALS(void,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,VCALLTYPE_CDECL)

#define DECLARENEW_4_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3,arg4); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,4,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4);\
	}
#define DECLARECTOR_4_WITH_DEF_VALS(func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4) DECLARENEW_4_WITH_DEF_VALS(void,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,VCALLTYPE_CDECL)

#define DECLARENEW_5_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3,arg4,arg5); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,5,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5);\
	}
#define DECLARECTOR_5_WITH_DEF_VALS(func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5) DECLARENEW_5_WITH_DEF_VALS(void,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,VCALLTYPE_CDECL)

#define DECLARENEW_6_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3,arg4,arg5,arg6); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,6,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6);\
	}
#define DECLARECTOR_6_WITH_DEF_VALS(func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6) DECLARENEW_6_WITH_DEF_VALS(void,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,VCALLTYPE_CDECL)

#define DECLARENEW_7_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3,arg4,arg5,arg6,arg7); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,7,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6,#arg7" = "#defVal7);\
	}
#define DECLARECTOR_7_WITH_DEF_VALS(func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7) DECLARENEW_7_WITH_DEF_VALS(void,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7,VCALLTYPE_CDECL)

#define DECLARENEW_8_WITH_DEF_VALS(ret,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7,arg8,defVal8,callconv) {\
	typedef ret (*fptr)(BYTE*,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,callconv,8,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6,#arg7" = "#defVal7,#arg8" = "#defVal8);\
	}
#define DECLARECTOR_8_WITH_DEF_VALS(func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7,arg8,defVal8) DECLARENEW_8_WITH_DEF_VALS(void,func,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7,arg8,defVal8,VCALLTYPE_CDECL)

///////////////////////////////////////////////////////////////////
// destructor Declaration


#ifdef __GNUC__
	#define DECLAREDESTRUCTORFUNCTION(classe) void __dest##classe(classe *obj){obj->~classe();}
	#define DECLAREDESTRUCTORFUNCTIONALIAS(classe, alias) void __dest##alias(classe *obj){obj->~classe();}
#else
	#define DECLAREDESTRUCTORFUNCTION(classe) void __dest##classe(classe *obj){obj->~##classe();}
	#define DECLAREDESTRUCTORFUNCTIONALIAS(classe, alias) void __dest##alias(classe *obj){obj->~##classe();}
#endif

#define DECLAREDESTRUCTOR(func) {\
	typedef void (*fptr)(BYTE*); \
	fptr rawPtr = (fptr) func; \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &rawPtr); \
	VSLM->RegisterFunction(#func,ptr,VCALLTYPE_CDECL,0,"void");\
}
///////////////////////////////////////////////////////////////////
// class method Declaration

#define FPTR(a) (fptr) a

#define DECLAREMETHOD_0(classe,ret,method) { \
	typedef ret (classe::*fptr)(); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,0,#ret);\
}

#define DECLAREMETHODC_0(classe,ret,method) { \
	typedef ret (classe::*fptr)() const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,0,#ret);\
}

#define DECLAREMETHOD_1(classe,ret,method,arg1) { \
	typedef ret (classe::*fptr)(arg1); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,1,#ret,#arg1);\
}

#define DECLAREMETHOD_1_WITH_DEF_VALS(classe,ret,method,arg1,defVal1) { \
	typedef ret (classe::*fptr)(arg1); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,1,#ret,#arg1" = "#defVal1);\
}

#define DECLAREMETHODC_1(classe,ret,method,arg1) { \
	typedef ret (classe::*fptr)(arg1) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,1,#ret,#arg1);\
}

#define DECLAREMETHODC_1_WITH_DEF_VALS(classe,ret,method,arg1,defVal1) { \
	typedef ret (classe::*fptr)(arg1) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,1,#ret,#arg1" = "#defVal1);\
}

#define DECLAREMETHOD_2(classe,ret,method,arg1,arg2) { \
	typedef ret (classe::*fptr)(arg1,arg2); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,2,#ret,#arg1,#arg2);\
}

#define DECLAREMETHOD_2_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2) { \
	typedef ret (classe::*fptr)(arg1,arg2); \
	fptr var = FPTR(fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,2,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2);\
}


#define DECLAREMETHODC_2(classe,ret,method,arg1,arg2) { \
	typedef ret (classe::*fptr)(arg1,arg2) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,2,#ret,#arg1,#arg2);\
}

#define DECLAREMETHODC_2_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2) { \
	typedef ret (classe::*fptr)(arg1,arg2) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,2,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2);\
}

#define DECLAREMETHOD_3(classe,ret,method,arg1,arg2,arg3) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,3,#ret,#arg1,#arg2,#arg3);\
}

#define DECLAREMETHOD_3_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,3,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3);\
}

#define DECLAREMETHODC_3(classe,ret,method,arg1,arg2,arg3) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,3,#ret,#arg1,#arg2,#arg3);\
}

#define DECLAREMETHODC_3_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,3,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3);\
}

#define DECLAREMETHOD_4(classe,ret,method,arg1,arg2,arg3,arg4) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,4,#ret,#arg1,#arg2,#arg3,#arg4);\
}

#define DECLAREMETHODC_4(classe,ret,method,arg1,arg2,arg3,arg4) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,4,#ret,#arg1,#arg2,#arg3,#arg4);\
}

#define DECLAREMETHOD_4_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,4,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4);\
}

#define DECLAREMETHODC_4_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,4,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4);\
}

#define DECLAREMETHOD_5(classe,ret,method,arg1,arg2,arg3,arg4,arg5) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,5,#ret,#arg1,#arg2,#arg3,#arg4,#arg5);\
}

#define DECLAREMETHODC_5(classe,ret,method,arg1,arg2,arg3,arg4,arg5) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,5,#ret,#arg1,#arg2,#arg3,#arg4,#arg5);\
}

#define DECLAREMETHOD_5_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,5,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5);\
}

#define DECLAREMETHODC_5_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,5,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5);\
}

#define DECLAREMETHOD_6(classe,ret,method,arg1,arg2,arg3,arg4,arg5,arg6) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,6,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6);\
}

#define DECLAREMETHODC_6(classe,ret,method,arg1,arg2,arg3,arg4,arg5,arg6) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,6,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6);\
}

#define DECLAREMETHOD_6_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,6,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6);\
}

#define DECLAREMETHODC_6_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,6,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6);\
}

#define DECLAREMETHOD_7(classe,ret,method,arg1,arg2,arg3,arg4,arg5,arg6,arg7) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,7,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6,#arg7);\
}

#define DECLAREMETHODC_7(classe,ret,method,arg1,arg2,arg3,arg4,arg5,arg6,arg7) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,7,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6,#arg7);\
}


#define DECLAREMETHOD_7_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,7,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6,#arg7" = "#defVal7);\
}

#define DECLAREMETHODC_7_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,7,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6,#arg7" = "#defVal7);\
}

#define DECLAREMETHOD_8(classe,ret,method,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,8,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6,#arg7,#arg8);\
}

#define DECLAREMETHODC_8(classe,ret,method,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,8,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6,#arg7,#arg8);\
}

#define DECLAREMETHOD_8_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7,arg8,defVal8) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,FALSE,ptr,VCALLTYPE_STDCALL,8,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6,#arg7" = "#defVal7,#arg8" = "#defVal8);\
}

#define DECLAREMETHODC_8_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7,arg8,defVal8) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) const; \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,TRUE,ptr,VCALLTYPE_STDCALL,8,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6,#arg7" = "#defVal7,#arg8" = "#defVal8);\
}

#define DECLAREMETHOD_9_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7,arg8,defVal8,arg9,defVal9) { \
	typedef ret (classe::*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9); \
	fptr var = FPTR(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,FALSE,ptr,VCALLTYPE_STDCALL,9,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6,#arg7" = "#defVal7,#arg8" = "#defVal8,#arg9" = "#defVal9);\
}

///////////////////////////////////////////////////////////////////
// class operator Declaration

inline const char* extractOperator(const char* opname)
{
	const char* s = opname+8;
	while (*s == ' ') ++s;
	return s;
}

#define DECLAREOP_0(classe,ret,op) { \
	typedef ret (classe::*fptr)(); \
	fptr var = (fptr)(&classe::op); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,extractOperator(#op),FALSE,FALSE,ptr,VCALLTYPE_STDCALL,0,#ret);\
}

#define DECLAREOP_1(classe,ret,op,arg1) { \
	typedef ret (classe::*fptr)(arg1); \
	fptr var = (fptr)(&classe::op); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,extractOperator(#op),FALSE,FALSE,ptr,VCALLTYPE_STDCALL,1,#ret,#arg1);\
}

#define DECLAREOP_2(classe,ret,op,arg1,arg2) { \
	typedef ret (classe::*fptr)(arg1,arg2); \
	fptr var = (fptr)(&classe::op); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,extractOperator(#op),FALSE,FALSE,ptr,VCALLTYPE_STDCALL,2,#ret,#arg1,#arg2);\
}

// constant versions

#define DECLAREOPC_0(classe,ret,op) { \
	typedef ret (classe::*fptr)() const; \
	fptr var = (fptr)(&classe::op); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,extractOperator(#op),FALSE,TRUE,ptr,VCALLTYPE_STDCALL,0,#ret);\
}

#define DECLAREOPC_1(classe,ret,op,arg1) { \
	typedef ret (classe::*fptr)(arg1) const; \
	fptr var = (fptr)(&classe::op); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,extractOperator(#op),FALSE,TRUE,ptr,VCALLTYPE_STDCALL,1,#ret,#arg1);\
}

#define DECLAREOPC_2(classe,ret,op,arg1,arg2) { \
	typedef ret (classe::*fptr)(arg1,arg2) const; \
	fptr var = (fptr)(&classe::op); \
	TPtrToRoutine ptr; \
	ptr.CreateMethodPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,extractOperator(#op),FALSE,TRUE,ptr,VCALLTYPE_STDCALL,2,#ret,#arg1,#arg2);\
}

///////////////////////////////////////////////////////////////////
// friend method Declaration

#define DECLAREFRIEND_0(ret,method) { \
	typedef ret (*fptr)(); \
	fptr var = (fptr)(&method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterFunction(#method,ptr,VCALLTYPE_CDECL,0,#ret);\
}

#define DECLAREFRIEND_1(ret,method,arg1) { \
	typedef ret (*fptr)(arg1); \
	fptr var = (fptr)(&method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterFunction(#method,ptr,VCALLTYPE_CDECL,1,#ret,#arg1);\
}

#define DECLAREFRIEND_2(ret,method,arg1,arg2) { \
	typedef ret (*fptr)(arg1,arg2); \
	fptr var = (fptr)(&method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterFunction(#method,ptr,VCALLTYPE_CDECL,2,#ret,#arg1,#arg2);\
}

#define DECLAREFRIEND_3(ret,method,arg1,arg2,arg3) { \
	typedef ret (*fptr)(arg1,arg2,arg3); \
	fptr var = (fptr)(&method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterFunction(#method,ptr,VCALLTYPE_CDECL,3,#ret,#arg1,#arg2,#arg3);\
}

#define DECLAREFRIEND_4(ret,method,arg1,arg2,arg3,arg4) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4); \
	fptr var = (fptr)(&method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterFunction(#method,ptr,VCALLTYPE_CDECL,4,#ret,#arg1,#arg2,#arg3,#arg4);\
}

///////////////////////////////////////////////////////////////////
// friend operator

#define DECLAREFRIENDOP_0(ret,op) { \
	typedef ret (*fptr)(); \
	fptr var = (fptr)(&op); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterFunction(extractOperator(#op),ptr,VCALLTYPE_CDECL,0,#ret);\
}

#define DECLAREFRIENDOP_1(ret,op,arg1) { \
	typedef ret (*fptr)(arg1); \
	fptr var = (fptr)(&op); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterFunction(extractOperator(#op),ptr,VCALLTYPE_CDECL,1,#ret,#arg1);\
}

#define DECLAREFRIENDOP_2(ret,op,arg1,arg2) { \
	typedef ret (*fptr)(arg1,arg2); \
	fptr var = (fptr)(&op); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterFunction(extractOperator(#op),ptr,VCALLTYPE_CDECL,2,#ret,#arg1,#arg2);\
}

///////////////////////////////////////////////////////////////////
// static method Declaration

#define DECLARESTATIC_0(classe,ret,method) { \
	typedef ret (*fptr)(); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,0,#ret);\
}

#define DECLARESTATIC_1(classe,ret,method,arg1) { \
	typedef ret (*fptr)(arg1); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,1,#ret,#arg1);\
}

#define DECLARESTATIC_2(classe,ret,method,arg1,arg2) { \
	typedef ret (*fptr)(arg1,arg2); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,2,#ret,#arg1,#arg2);\
}

#define DECLARESTATIC_3(classe,ret,method,arg1,arg2,arg3) { \
	typedef ret (*fptr)(arg1,arg2,arg3); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,3,#ret,#arg1,#arg2,#arg3);\
}

#define DECLARESTATIC_4(classe,ret,method,arg1,arg2,arg3,arg4) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,4,#ret,#arg1,#arg2,#arg3,#arg4);\
}

#define DECLARESTATIC_5(classe,ret,method,arg1,arg2,arg3,arg4,arg5) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,5,#ret,#arg1,#arg2,#arg3,#arg4,#arg5);\
}

#define DECLARESTATIC_6(classe,ret,method,arg1,arg2,arg3,arg4,arg5,arg6) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,6,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6);\
}

#define DECLARESTATIC_7(classe,ret,method,arg1,arg2,arg3,arg4,arg5,arg6,arg7) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,7,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6,#arg7);\
}

#define DECLARESTATIC_8(classe,ret,method,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,8,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6,#arg7,#arg8);\
}

#define DECLARESTATIC_9(classe,ret,method,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8, arg9) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,9,#ret,#arg1,#arg2,#arg3,#arg4,#arg5,#arg6,#arg7,#arg8,#arg9);\
}

// With Default Values 

#define DECLARESTATIC_1_WITH_DEF_VALS(classe,ret,method,arg1,defVal1) { \
	typedef ret (*fptr)(arg1); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,1,#ret,#arg1#defVal1);\
}

#define DECLARESTATIC_2_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2) { \
	typedef ret (*fptr)(arg1,arg2); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,2,#ret,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2);\
}

#define DECLARESTATIC_3_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3) { \
	typedef ret (*fptr)(arg1,arg2,arg3); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,3,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3);\
}

#define DECLARESTATIC_4_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,4,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4);\
}

#define DECLARESTATIC_5_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,5,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5);\
}

#define DECLARESTATIC_6_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,6,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6);\
}

#define DECLARESTATIC_7_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,7,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6,#arg7" = "#defVal7);\
}

#define DECLARESTATIC_8_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7,arg8,defVal8) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,8,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6,#arg7" = "#defVal7,#arg8" = "#defVal8);\
}

#define DECLARESTATIC_9_WITH_DEF_VALS(classe,ret,method,arg1,defVal1,arg2,defVal2,arg3,defVal3,arg4,defVal4,arg5,defVal5,arg6,defVal6,arg7,defVal7,arg8,defVal8,arg9,defVal9) { \
	typedef ret (*fptr)(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9); \
	fptr var = (fptr)(&classe::method); \
	TPtrToRoutine ptr; \
	ptr.CreateFunctionPtr((void**) &var); \
	VSLM->RegisterMethod(#classe,#method,TRUE,FALSE,ptr,VCALLTYPE_CDECL,9,#ret,#arg1" = "#defVal1,#arg2" = "#defVal2,#arg3" = "#defVal3,#arg4" = "#defVal4,#arg5" = "#defVal5,#arg6" = "#defVal6,#arg7" = "#defVal7,#arg8" = "#defVal8,#arg9" = "#defVal9);\
}

///////////////////////////////////////////////////////////////////
// Enum for array of GUID used by binded function GetGUID

enum PGUID
{
	PGUID_NONE = 0,
	PGUID_VOIDBUF,
	PGUID_FLOAT,
	PGUID_ANGLE,
	PGUID_PERCENTAGE,
	PGUID_INT,
	PGUID_KEY,
	PGUID_BOOL,
	PGUID_STRING,
	PGUID_RECT,
	PGUID_VECTOR,
	PGUID_2DVECTOR,
	PGUID_QUATERNION,
	PGUID_EULERANGLES,
	PGUID_MATRIX,
	PGUID_COLOR,
	PGUID_BOX,
	PGUID_OBJECTARRAY,
	PGUID_OBJECT,	
	PGUID_BEOBJECT,
	PGUID_MESH,
	PGUID_MATERIAL,
	PGUID_TEXTURE,
	PGUID_SPRITE,
	PGUID_3DENTITY,
	PGUID_CURVEPOINT,
	PGUID_LIGHT,
	PGUID_TARGETLIGHT,
	PGUID_ID,
	PGUID_CAMERA,
	PGUID_TARGETCAMERA,
	PGUID_SPRITE3D,
	PGUID_OBJECT3D,
	PGUID_BODYPART,
	PGUID_CHARACTER,
	PGUID_CURVE,
	PGUID_2DCURVE,
	PGUID_LEVEL,
	PGUID_PLACE,
	PGUID_GROUP,
	PGUID_2DENTITY,
	PGUID_RENDEROBJECT,
	PGUID_SPRITETEXT,
	PGUID_SOUND,
	PGUID_WAVESOUND,
	PGUID_MIDISOUND,
	PGUID_OBJECTANIMATION,
	PGUID_ANIMATION,
	PGUID_KINEMATICCHAIN,
	PGUID_SCENE,
	PGUID_BEHAVIOR,
	PGUID_MESSAGE,
	PGUID_SYNCHRO,
	PGUID_CRITICALSECTION,
	PGUID_STATE,
	PGUID_ATTRIBUTE,
	PGUID_CLASSID,
	PGUID_DIRECTION,
	PGUID_BLENDMODE,
	PGUID_FILTERMODE,
	PGUID_BLENDFACTOR,
	PGUID_FILLMODE,
	PGUID_LITMODE,
	PGUID_SHADEMODE,
	PGUID_GLOBALEXMODE,
	PGUID_ZFUNC,
	PGUID_ADDRESSMODE,
	PGUID_WRAPMODE,
	PGUID_3DSPRITEMODE,
	PGUID_FOGMODE,
	PGUID_LIGHTTYPE,
	PGUID_SPRITEALIGN,
	PGUID_SCRIPT,
	PGUID_LAYERTYPE,
	PGUID_STATECHUNK,
	PGUID_DATAARRAY,
	PGUID_COMPOPERATOR,
	PGUID_BINARYOPERATOR,
	PGUID_SETOPERATOR,
	PGUID_SPRITETEXTALIGNMENT,
	PGUID_OBSTACLEPRECISION,
	PGUID_OBSTACLEPRECISIONBEH,
	PGUID_OBSTACLE,
	PGUID_PATCHMESH,
	PGUID_POINTER,
	PGUID_ENUMS,
	PGUID_STRUCTS,
	PGUID_FLAGS,
	PGUID_FILTER,
	PGUID_TIME,
	PGUID_OLDTIME,
	PGUID_COPYDEPENDENCIES,
	PGUID_DELETEDEPENDENCIES,
	PGUID_SAVEDEPENDENCIES,
	PGUID_REPLACEDEPENDENCIES,
	PGUID_SCENEACTIVITYFLAGS,
	PGUID_SCENEOBJECT,
	PGUID_SCENERESETFLAGS,
	PGUID_ARRAYTYPE,
	PGUID_RENDEROPTIONS,
	PGUID_PARAMETERTYPE,
	PGUID_MATERIALEFFECT,
	PGUID_TEXGENEFFECT,
	PGUID_TEXGENREFEFFECT,
	PGUID_COMBINE2TEX,
	PGUID_COMBINE3TEX,
	PGUID_BUMPMAPPARAM,
	PGUID_TEXCOMBINE,
	PGUID_PIXELFORMAT,
	PGUID_AXIS,
	PGUID_SUPPORT,
	PGUID_BITMAP_SYSTEMCACHING,
	PGUID_OLDMESSAGE,
	PGUID_OLDATTRIBUTE,
	PGUID_3DPOINTCLOUD,
	PGUID_VIDEO,
	PGUID_RTVIEW,

	PGUID_LASTGUID // must stay in last position
};
