Utility library for providing native functionality to the Squirrel environment.

Dependents:   Squirrel

Revision:
0:a9a5c12f2d30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/sqmethods.inc	Tue Dec 16 08:15:55 2014 +0000
@@ -0,0 +1,1351 @@
+/////////////////////
+// SqBind 0 arguments 
+/////////////////////
+
+template<class T >
+SQInteger _sqbind_sqmethod_0(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)();	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	
+	(self->*method)();		
+	
+	return 0;
+}
+
+template<class T >
+SQInteger _sqbind_sqmethod_0c(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)() const;	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	
+	(self->*method)();		
+	
+	return 0;
+}
+
+template<class T, class R>
+SQInteger _sqbind_sqmethod_0r(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)();
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+		
+	R r = (self->*method)();		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T, class R>
+SQInteger _sqbind_sqmethod_0rc(HSQUIRRELVM v) {
+
+	const T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)() const;
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+		
+	R r = (self->*method)();		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)() ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_0<T>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)() const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_0c<T>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T ,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)() ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_0r<T,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)() const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_0rc<T,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+// STATIC METHODS / FUNCTIONS
+
+// using vm as template parameter.... 
+// otherwise overload won't work
+
+template<class VM>
+SQInteger _sqbind_sqfunction_0(VM v) {
+
+	typedef void (*F)();	
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	
+	(function)();		
+	
+	return 0;
+}
+
+
+
+template<class VM, class R>
+SQInteger _sqbind_sqfunction_0r(VM v) {
+
+	typedef R (*F)();
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+		
+	R r = (function)();		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+//call for functions
+template<class VM>
+void sqbind_function( VM v, const SQChar *p_name,  void (*function)(), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+		
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_0<VM>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+template<class VM, class R>
+void sqbind_function( VM v, const SQChar *p_name,  R (*function)(), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_0r<VM,R>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+/////////////////////
+// SqBind 1 arguments 
+/////////////////////
+
+template<class T,class P1 >
+SQInteger _sqbind_sqmethod_1(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1);	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+
+	(self->*method)(p1.getter.get(v,2));		
+	
+	return 0;
+}
+
+template<class T,class P1 >
+SQInteger _sqbind_sqmethod_1c(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1) const;	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+
+	(self->*method)(p1.getter.get(v,2));		
+	
+	return 0;
+}
+
+template<class T,class P1, class R>
+SQInteger _sqbind_sqmethod_1r(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1);
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	
+	R r = (self->*method)(p1.getter.get(v,2));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class R>
+SQInteger _sqbind_sqmethod_1rc(HSQUIRRELVM v) {
+
+	const T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1) const;
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	
+	R r = (self->*method)(p1.getter.get(v,2));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_1<T,P1>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_1c<T,P1>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1 ,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_1r<T,P1,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_1rc<T,P1,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+// STATIC METHODS / FUNCTIONS
+
+// using vm as template parameter.... 
+// otherwise overload won't work
+
+template<class VM,class P1>
+SQInteger _sqbind_sqfunction_1(VM v) {
+
+	typedef void (*F)(P1);	
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+
+	(function)(p1.getter.get(v,2));		
+	
+	return 0;
+}
+
+
+
+template<class VM,class P1, class R>
+SQInteger _sqbind_sqfunction_1r(VM v) {
+
+	typedef R (*F)(P1);
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	
+	R r = (function)(p1.getter.get(v,2));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+//call for functions
+template<class VM,class P1>
+void sqbind_function( VM v, const SQChar *p_name,  void (*function)(P1), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+		
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_1<VM,P1>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+template<class VM, class P1,class R>
+void sqbind_function( VM v, const SQChar *p_name,  R (*function)(P1), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_1r<VM,P1,R>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+/////////////////////
+// SqBind 2 arguments 
+/////////////////////
+
+template<class T,class P1, class P2 >
+SQInteger _sqbind_sqmethod_2(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1, P2);	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+
+	(self->*method)(p1.getter.get(v,2), p2.getter.get(v,3));		
+	
+	return 0;
+}
+
+template<class T,class P1, class P2 >
+SQInteger _sqbind_sqmethod_2c(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1, P2) const;	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+
+	(self->*method)(p1.getter.get(v,2), p2.getter.get(v,3));		
+	
+	return 0;
+}
+
+template<class T,class P1, class P2, class R>
+SQInteger _sqbind_sqmethod_2r(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1, P2);
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	
+	R r = (self->*method)(p1.getter.get(v,2), p2.getter.get(v,3));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class P2, class R>
+SQInteger _sqbind_sqmethod_2rc(HSQUIRRELVM v) {
+
+	const T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1, P2) const;
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	
+	R r = (self->*method)(p1.getter.get(v,2), p2.getter.get(v,3));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class P2>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1, P2) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_2<T,P1, P2>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1, P2) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_2c<T,P1, P2>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2 ,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1, P2) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_2r<T,P1, P2,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1, P2) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_2rc<T,P1, P2,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+// STATIC METHODS / FUNCTIONS
+
+// using vm as template parameter.... 
+// otherwise overload won't work
+
+template<class VM,class P1, class P2>
+SQInteger _sqbind_sqfunction_2(VM v) {
+
+	typedef void (*F)(P1, P2);	
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+
+	(function)(p1.getter.get(v,2), p2.getter.get(v,3));		
+	
+	return 0;
+}
+
+
+
+template<class VM,class P1, class P2, class R>
+SQInteger _sqbind_sqfunction_2r(VM v) {
+
+	typedef R (*F)(P1, P2);
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	
+	R r = (function)(p1.getter.get(v,2), p2.getter.get(v,3));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+//call for functions
+template<class VM,class P1, class P2>
+void sqbind_function( VM v, const SQChar *p_name,  void (*function)(P1, P2), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+		
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_2<VM,P1, P2>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+template<class VM, class P1, class P2,class R>
+void sqbind_function( VM v, const SQChar *p_name,  R (*function)(P1, P2), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_2r<VM,P1, P2,R>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+/////////////////////
+// SqBind 3 arguments 
+/////////////////////
+
+template<class T,class P1, class P2, class P3 >
+SQInteger _sqbind_sqmethod_3(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1, P2, P3);	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+
+	(self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4));		
+	
+	return 0;
+}
+
+template<class T,class P1, class P2, class P3 >
+SQInteger _sqbind_sqmethod_3c(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1, P2, P3) const;	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+
+	(self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4));		
+	
+	return 0;
+}
+
+template<class T,class P1, class P2, class P3, class R>
+SQInteger _sqbind_sqmethod_3r(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1, P2, P3);
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	
+	R r = (self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class P2, class P3, class R>
+SQInteger _sqbind_sqmethod_3rc(HSQUIRRELVM v) {
+
+	const T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1, P2, P3) const;
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	
+	R r = (self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class P2, class P3>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1, P2, P3) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_3<T,P1, P2, P3>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1, P2, P3) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_3c<T,P1, P2, P3>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3 ,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1, P2, P3) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_3r<T,P1, P2, P3,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1, P2, P3) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_3rc<T,P1, P2, P3,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+// STATIC METHODS / FUNCTIONS
+
+// using vm as template parameter.... 
+// otherwise overload won't work
+
+template<class VM,class P1, class P2, class P3>
+SQInteger _sqbind_sqfunction_3(VM v) {
+
+	typedef void (*F)(P1, P2, P3);	
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+
+	(function)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4));		
+	
+	return 0;
+}
+
+
+
+template<class VM,class P1, class P2, class P3, class R>
+SQInteger _sqbind_sqfunction_3r(VM v) {
+
+	typedef R (*F)(P1, P2, P3);
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	
+	R r = (function)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+//call for functions
+template<class VM,class P1, class P2, class P3>
+void sqbind_function( VM v, const SQChar *p_name,  void (*function)(P1, P2, P3), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+		
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_3<VM,P1, P2, P3>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+template<class VM, class P1, class P2, class P3,class R>
+void sqbind_function( VM v, const SQChar *p_name,  R (*function)(P1, P2, P3), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_3r<VM,P1, P2, P3,R>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+/////////////////////
+// SqBind 4 arguments 
+/////////////////////
+
+template<class T,class P1, class P2, class P3, class P4 >
+SQInteger _sqbind_sqmethod_4(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1, P2, P3, P4);	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+
+	(self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5));		
+	
+	return 0;
+}
+
+template<class T,class P1, class P2, class P3, class P4 >
+SQInteger _sqbind_sqmethod_4c(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1, P2, P3, P4) const;	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+
+	(self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5));		
+	
+	return 0;
+}
+
+template<class T,class P1, class P2, class P3, class P4, class R>
+SQInteger _sqbind_sqmethod_4r(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1, P2, P3, P4);
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	
+	R r = (self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class P2, class P3, class P4, class R>
+SQInteger _sqbind_sqmethod_4rc(HSQUIRRELVM v) {
+
+	const T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1, P2, P3, P4) const;
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	
+	R r = (self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class P2, class P3, class P4>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1, P2, P3, P4) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_4<T,P1, P2, P3, P4>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3, class P4>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1, P2, P3, P4) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_4c<T,P1, P2, P3, P4>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3, class P4 ,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1, P2, P3, P4) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_4r<T,P1, P2, P3, P4,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3, class P4,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1, P2, P3, P4) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_4rc<T,P1, P2, P3, P4,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+// STATIC METHODS / FUNCTIONS
+
+// using vm as template parameter.... 
+// otherwise overload won't work
+
+template<class VM,class P1, class P2, class P3, class P4>
+SQInteger _sqbind_sqfunction_4(VM v) {
+
+	typedef void (*F)(P1, P2, P3, P4);	
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+
+	(function)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5));		
+	
+	return 0;
+}
+
+
+
+template<class VM,class P1, class P2, class P3, class P4, class R>
+SQInteger _sqbind_sqfunction_4r(VM v) {
+
+	typedef R (*F)(P1, P2, P3, P4);
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	
+	R r = (function)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+//call for functions
+template<class VM,class P1, class P2, class P3, class P4>
+void sqbind_function( VM v, const SQChar *p_name,  void (*function)(P1, P2, P3, P4), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+		
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_4<VM,P1, P2, P3, P4>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+template<class VM, class P1, class P2, class P3, class P4,class R>
+void sqbind_function( VM v, const SQChar *p_name,  R (*function)(P1, P2, P3, P4), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_4r<VM,P1, P2, P3, P4,R>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+/////////////////////
+// SqBind 5 arguments 
+/////////////////////
+
+template<class T,class P1, class P2, class P3, class P4, class P5 >
+SQInteger _sqbind_sqmethod_5(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1, P2, P3, P4, P5);	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+
+	(self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6));		
+	
+	return 0;
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5 >
+SQInteger _sqbind_sqmethod_5c(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1, P2, P3, P4, P5) const;	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+
+	(self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6));		
+	
+	return 0;
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5, class R>
+SQInteger _sqbind_sqmethod_5r(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1, P2, P3, P4, P5);
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+	
+	R r = (self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5, class R>
+SQInteger _sqbind_sqmethod_5rc(HSQUIRRELVM v) {
+
+	const T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1, P2, P3, P4, P5) const;
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+	
+	R r = (self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1, P2, P3, P4, P5) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_5<T,P1, P2, P3, P4, P5>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1, P2, P3, P4, P5) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_5c<T,P1, P2, P3, P4, P5>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5 ,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1, P2, P3, P4, P5) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_5r<T,P1, P2, P3, P4, P5,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1, P2, P3, P4, P5) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_5rc<T,P1, P2, P3, P4, P5,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+// STATIC METHODS / FUNCTIONS
+
+// using vm as template parameter.... 
+// otherwise overload won't work
+
+template<class VM,class P1, class P2, class P3, class P4, class P5>
+SQInteger _sqbind_sqfunction_5(VM v) {
+
+	typedef void (*F)(P1, P2, P3, P4, P5);	
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+
+	(function)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6));		
+	
+	return 0;
+}
+
+
+
+template<class VM,class P1, class P2, class P3, class P4, class P5, class R>
+SQInteger _sqbind_sqfunction_5r(VM v) {
+
+	typedef R (*F)(P1, P2, P3, P4, P5);
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+	
+	R r = (function)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+//call for functions
+template<class VM,class P1, class P2, class P3, class P4, class P5>
+void sqbind_function( VM v, const SQChar *p_name,  void (*function)(P1, P2, P3, P4, P5), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+		
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_5<VM,P1, P2, P3, P4, P5>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+template<class VM, class P1, class P2, class P3, class P4, class P5,class R>
+void sqbind_function( VM v, const SQChar *p_name,  R (*function)(P1, P2, P3, P4, P5), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_5r<VM,P1, P2, P3, P4, P5,R>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+/////////////////////
+// SqBind 6 arguments 
+/////////////////////
+
+template<class T,class P1, class P2, class P3, class P4, class P5, class P6 >
+SQInteger _sqbind_sqmethod_6(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1, P2, P3, P4, P5, P6);	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+	SqCParam<P6> p6;
+
+	(self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6), p6.getter.get(v,7));		
+	
+	return 0;
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5, class P6 >
+SQInteger _sqbind_sqmethod_6c(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );
+	typedef void (T::*M)(P1, P2, P3, P4, P5, P6) const;	
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+	SqCParam<P6> p6;
+
+	(self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6), p6.getter.get(v,7));		
+	
+	return 0;
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5, class P6, class R>
+SQInteger _sqbind_sqmethod_6r(HSQUIRRELVM v) {
+
+	T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1, P2, P3, P4, P5, P6);
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+	SqCParam<P6> p6;
+	
+	R r = (self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6), p6.getter.get(v,7));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5, class P6, class R>
+SQInteger _sqbind_sqmethod_6rc(HSQUIRRELVM v) {
+
+	const T* self = &SqBind<T>::get(v, 1 );		
+	typedef R (T::*M)(P1, P2, P3, P4, P5, P6) const;
+	M*methodptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&methodptr,NULL);
+	M method = *methodptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+	SqCParam<P6> p6;
+	
+	R r = (self->*method)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6), p6.getter.get(v,7));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5, class P6>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1, P2, P3, P4, P5, P6) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_6<T,P1, P2, P3, P4, P5, P6>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5, class P6>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  void (T::*method)(P1, P2, P3, P4, P5, P6) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_6c<T,P1, P2, P3, P4, P5, P6>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5, class P6 ,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1, P2, P3, P4, P5, P6) ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_6r<T,P1, P2, P3, P4, P5, P6,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+template<class T,class P1, class P2, class P3, class P4, class P5, class P6,class R>
+void sqbind_method( HSQUIRRELVM v, const SQChar *p_name,  R (T::*method)(P1, P2, P3, P4, P5, P6) const ) {
+
+	sq_pushobject(v,SqBind<T>::get_id()); // push class
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,method);
+	sq_newclosure(v,_sqbind_sqmethod_6rc<T,P1, P2, P3, P4, P5, P6,R>,1);
+	sq_newslot(v,-3,false);
+	sq_pop(v,1); // pop class
+
+}
+
+// STATIC METHODS / FUNCTIONS
+
+// using vm as template parameter.... 
+// otherwise overload won't work
+
+template<class VM,class P1, class P2, class P3, class P4, class P5, class P6>
+SQInteger _sqbind_sqfunction_6(VM v) {
+
+	typedef void (*F)(P1, P2, P3, P4, P5, P6);	
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+	SqCParam<P6> p6;
+
+	(function)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6), p6.getter.get(v,7));		
+	
+	return 0;
+}
+
+
+
+template<class VM,class P1, class P2, class P3, class P4, class P5, class P6, class R>
+SQInteger _sqbind_sqfunction_6r(VM v) {
+
+	typedef R (*F)(P1, P2, P3, P4, P5, P6);
+	F*functionptr;	
+	sq_getuserdata(v,-1,(SQUserPointer*)&functionptr,NULL);
+	F function = *functionptr;
+	SqCParam<P1> p1;
+	SqCParam<P2> p2;
+	SqCParam<P3> p3;
+	SqCParam<P4> p4;
+	SqCParam<P5> p5;
+	SqCParam<P6> p6;
+	
+	R r = (function)(p1.getter.get(v,2), p2.getter.get(v,3), p3.getter.get(v,4), p4.getter.get(v,5), p5.getter.get(v,6), p6.getter.get(v,7));		
+	_SQBC( R )::push(v, r );
+	return 1;
+}
+
+//call for functions
+template<class VM,class P1, class P2, class P3, class P4, class P5, class P6>
+void sqbind_function( VM v, const SQChar *p_name,  void (*function)(P1, P2, P3, P4, P5, P6), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+		
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_6<VM,P1, P2, P3, P4, P5, P6>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+
+template<class VM, class P1, class P2, class P3, class P4, class P5, class P6,class R>
+void sqbind_function( VM v, const SQChar *p_name,  R (*function)(P1, P2, P3, P4, P5, P6), const HSQOBJECT *p_class_id=NULL ) {
+
+	if (p_class_id)
+		sq_pushobject(v,*p_class_id); // push class
+	else
+		sq_pushroottable(v);
+	sq_pushstring(v,p_name,-1);
+	sqbind_push_method_userdata(v,function);
+	sq_newclosure(v,_sqbind_sqfunction_6r<VM,P1, P2, P3, P4, P5, P6,R>,1);
+	sq_newslot(v,-3,p_class_id!=NULL);
+	sq_pop(v,1); // pop class
+
+}
+
+