Of course, it would be possible to duplicate the script modules, so that there is one module for each object instance, but that would be impose a rather big overhead for the application. Script classes don't have that overhead, as all instances share the same module, and thus the same bytecode and function ids, etc.
If the application knows the name of the class, either hardcoded or from some configuration, the class type can easily be obtained by calling the module's GetTypeIdByDecl with the name of the class. The application can also choose to identify the class through some properties of the class, e.g. if the class implements a predefined interface. Then the application can enumerate the class types implemented in the script with GetObjectTypeByIndex and then examine the type through the asIObjectType interface.
A third option, if you're using the script builder add-on, is to use the metadata to identify the class. If you choose this option, use the asIScriptModule to enumerate the declared types and then query the CScriptBuilder for their metadata.
Once the object type is known you create the instance by calling the class' factory function, passing it the necessary arguments, e.g. a pointer to the application object which the script class should be bound to. The factory function id is found by querying the asIObjectType.
// Get the object type asIScriptModule *module = engine->GetModule("MyModule"); asIObjectType *type = engine->GetObjectTypeById(module->GetTypeIdByDecl("MyClass")); // Get the factory function id from the object type int factoryId = type->GetFactoryIdByDecl("MyClass @MyClass(int)");
The factory function is called as a regular global function and returns a handle to the newly instanciated class.
// Obtain the id of the class method int funcId = type->GetMethodIdByDecl("void method()"); // Prepare the context for calling the method ctx->Prepare(funcId); // Set the object pointer ctx->SetObject(obj); // Execute the call ctx->Execute();