text: 
  #include "SquirrelObject.h"
  #include "SquirrelVM.h"
  #include "SquirrelBindingsUtils.h"
  
  BOOL SbuCreateStaticNamespace(HSQUIRRELVM v,ScriptNamespaceDecl *sn)
  {
  	int n = 0;
  	sq_pushroottable(v);
  	sq_pushstring(v,sn->name,-1);
  	sq_newtable(v);
  	const ScriptClassMemberDecl *members = sn->members;
  	const ScriptClassMemberDecl *m = NULL;
  	while(members[n].name) {
  		m = &members[n];
  		sq_pushstring(v,m->name,-1);
  		sq_newclosure(v,m->func,0);
  		sq_setparamscheck(v,m->params,m->typemask);
  		sq_setnativeclosurename(v,-1,m->name);
  		sq_createslot(v,-3);
  		n++;
  	}
  	const ScriptConstantDecl *consts = sn->constants;
  	const ScriptConstantDecl *c = NULL;
  	n = 0;
  	while(consts[n].name) {
  		c = &consts[n];
  		sq_pushstring(v,c->name,-1);
  		switch(c->type) {
  		case OT_STRING: sq_pushstring(v,c->val.s,-1);break;
  		case OT_INTEGER: sq_pushinteger(v,c->val.i);break;
  		case OT_FLOAT: sq_pushfloat(v,c->val.f);break;
  		}
  		sq_createslot(v,-3);
  		n++;
  	}
  	if(sn->delegate) {
  		const ScriptClassMemberDecl *members = sn->delegate;
  		const ScriptClassMemberDecl *m = NULL;
  		sq_newtable(v);
  		while(members[n].name) {
  			m = &members[n];
  			sq_pushstring(v,m->name,-1);
  			sq_newclosure(v,m->func,0);
  			sq_setparamscheck(v,m->params,m->typemask);
  			sq_setnativeclosurename(v,-1,m->name);
  			sq_createslot(v,-3);
  			n++;
  		}
  		sq_setdelegate(v,-2);
  	}
  	sq_createslot(v,-3);
  	sq_pop(v,1);
  	
  	return TRUE;
  }
  
  BOOL SbuCreateClass(HSQUIRRELVM v,SquirrelClassDecl *cd)
  {
  	int n = 0;
  	int oldtop = sq_gettop(v);
  	sq_pushroottable(v);
  	sq_pushstring(v,cd->name,-1);
  	if(cd->base) {
  		sq_pushstring(v,cd->base,-1);
  		if(SQ_FAILED(sq_get(v,-3))) {
  			sq_settop(v,oldtop);
  			return FALSE;
  		}
  	}
  	if(SQ_FAILED(sq_newclass(v,cd->base?1:0))) {
  		sq_settop(v,oldtop);
  		return FALSE;
  	}
  	sq_settypetag(v,-1,(SQUserPointer)cd);
  	const ScriptClassMemberDecl *members = cd->members;
  	const ScriptClassMemberDecl *m = NULL;
  	while(members[n].name) {
  		m = &members[n];
  		sq_pushstring(v,m->name,-1);
  		sq_newclosure(v,m->func,0);
  		sq_setparamscheck(v,m->params,m->typemask);
  		sq_setnativeclosurename(v,-1,m->name);
  		sq_createslot(v,-3);
  		n++;
  	}
  	sq_createslot(v,-3);
  	sq_pop(v,1);
  	return TRUE;
  }
  
  int refcounted_release_hook(SQUserPointer p, int size)
  {
  	IUnknown *pRC = (IUnknown*)p;
  	pRC->Release();
  	return 0;
  }
  
  BOOL SbuCreateNativeClassInstance(HSQUIRRELVM v,const SQChar *classname,SQUserPointer ud,SQRELEASEHOOK hook)
  {
  	int oldtop = sq_gettop(v);
  	sq_pushroottable(v);
  	sq_pushstring(v,classname,-1);
  	if(SQ_FAILED(sq_rawget(v,-2))){
  		sq_settop(v,oldtop);
  		return FALSE;
  	}
  	//sq_pushroottable(v);
  	if(SQ_FAILED(sq_createinstance(v,-1))) {
  		sq_settop(v,oldtop);
  		return FALSE;
  	}
  	sq_remove(v,-3); //removes the root table
  	sq_remove(v,-2); //removes the the class
  	if(SQ_FAILED(sq_setinstanceup(v,-1,ud))) {
  		sq_settop(v,oldtop);
  		return FALSE;
  	}
  	sq_setreleasehook(v,-1,hook);
  	return TRUE;
  }
  
  static BOOL __CreateRefCountedInstance(HSQUIRRELVM v,const SQChar *classname,IUnknown *pRC,SQRELEASEHOOK hook)
  {
  	if(!SbuCreateNativeClassInstance(v,classname,pRC,hook))
  		return FALSE;
  	return TRUE;
  }
  
  int construct_RefCounted(HSQUIRRELVM v,IUnknown *p)
  {
  	sq_setinstanceup(v,1,p);
  	sq_setreleasehook(v,1,refcounted_release_hook);
  	return 1;
  }
  
  
  BOOL SbuCreateRefCountedInstance(HSQUIRRELVM v,const SQChar *classname,IUnknown *pRC)
  {
  	return __CreateRefCountedInstance(v,classname,pRC,refcounted_release_hook);
  }
  
  
  SQInteger SbuRegisterGlobalFunc(HSQUIRRELVM v, SQFUNCTION f, const SQChar* fname)
  {
      sq_pushroottable(v);
      sq_pushstring(v,fname,-1);
      sq_newclosure(v,f,0); //create a new function
      sq_newslot(v,-3,SQFalse); 
      sq_pop(v,1); //pops the root table  
      return 0;
  }
  
  