Common usage patterns
declare a variable and bind it
SGS_PROPERTY float x;
bind an inherited variable
SGS_PROPERTY SGS_ALIAS( float x );
bind & declare variable with post-write callback
SGS_PROPERTY_FUNC( READ WRITE WRITE_CALLBACK myWriteCallback ) float x;
bind a fake variable (based on get/set functions)
SGS_PROPERTY_FUNC( READ getX WRITE setX ) SGS_ALIAS( float x );
bind & declare a variable with two different names
SGS_PROPERTY_FUNC( READ WRITE VARNAME sgsName ) float x;
bind an inherited/previously defined variable
SGS_PROPERTY_FUNC( READ WRITE VARNAME sgsName ) SGS_ALIAS( float x );
bind a related, potentially unsafe variable
SGS_PROPERTY_FUNC( READ WRITE VALIDATE parent SOURCE parent->name ) SGS_ALIAS( sgsString parentName );
declare a method and bind it
SGS_METHOD float calc( float x );
declare a differently named method
SGS_METHOD_NAMED( func ) void sgsFunc( int i );
declare a coroutine-aware method
// ctx is passed automatically, does not affect argument count/order
SGS_METHOD void coroAware( sgs_Context* coroCtx, float arg0 );
// SGS_CTX works too, but may trigger a warning about variable shadowing
declare a vararg method with variable return value count
SGS_METHOD SGS_MULTRET complexFunc();
handle class stub
typedef sgsHandle< struct sgsObj > sgsObjHandle;
struct sgsObj
{
SGS_OBJECT;
static sgsObjHandle HandleFromPtr( Obj* ); // resolve the link through object's user data pointer or some similar method
sgsObj( Obj* obj ) : m_obj( obj ){}
~sgsObj(){ cleanup(); }
void cleanup() // this is pulled out of constructor in case it might be called by a parent object to invalidate the handle on destruction of the owning system
{
if( m_obj )
{
// *** free m_obj ***
m_obj = NULL;
}
}
Obj* m_obj;
// declare additional properties and methods with SGS_PROPERTY(_FUNC) and SGS_METHOD, respectively
// most properties/methods will most likely have to include a NULL test for m_obj, like this:
int _getProp(){ return m_obj ? m_obj->GetProp() : 0; }
void _setProp( int v ){ if( m_obj ) m_obj->SetProp( v ); }
SGS_PROPERTY_FUNC( READ _getProp WRITE _setProp ) SGS_ALIAS( int prop );
};
data struct stub
struct sgsData : Data
{
SGS_OBJECT_LITE;
sgsData(){}
sgsData( const Data& t ) : Data( t ){}
// properties with direct access (non-private)
SGS_PROPERTY SGS_ALIAS( item1 );
// data struct properties (original type: SubData, wrapped type: sgsSubData)
sgsSubData _getSubData(){ return subData; }
void _setSubData( const sgsSubData& sd ){ subData = sd; }
SGS_PROPERTY_FUNC( READ _getSubData WRITE _setSubData ) SGS_ALIAS( sgsSubData subData );
// properties with method access
int _getProp(){ return GetProp(); }
void _setProp( int v ){ SetProp( v ); }
SGS_PROPERTY_FUNC( READ _getProp WRITE _setProp ) SGS_ALIAS( int prop );
// aliases (second names) for all properties:
SGS_PROPERTY_FUNC( READ WRITE VARNAME item1alt ) SGS_ALIAS( bool item1 );
SGS_PROPERTY_FUNC( READ _getSubData WRITE _setSubData VARNAME subDataAlt ) SGS_ALIAS( sgsSubData subData );
SGS_PROPERTY_FUNC( READ _getProp WRITE _setProp VARNAME propAlt ) SGS_ALIAS( int prop );
};
SGS_DEFAULT_LITE_OBJECT_INTERFACE( sgsData ); // this line can be replaced with a modified combo of sgs_PushVar/sgs_GetVar declarations