/*! * @file script_class.h * @brief Definition of ... */ #ifndef _SCRIPT_CLASS_H #define _SCRIPT_CLASS_H #include "base_object.h" #include "script.h" #include "lunar.h" #include "script_method.h" /** * Creates a factory to a Loadable Class. * this should be used at the beginning of all the Classes that should be loadable (in the cc-file) */ #define CREATE_SCRIPTABLE_CLASS(CLASS_NAME, SCRIPT_METHODS) \ tScriptClass global_##CLASS_NAME##_ScriptableClass(#CLASS_NAME, CLASS_NAME::staticClassID(), (new ScriptMethod)->SCRIPT_METHODS) //! A class for ... class ScriptClass : public BaseObject { ObjectListDeclaration(ScriptClass); public: virtual ~ScriptClass(); virtual void registerClass(Script* script) = 0; virtual int insertObject(Script* L, BaseObject* obj, bool gc=false) = 0; virtual int insertObject(Script* L, BaseObject* obj, const std::string& name, bool gc=false) = 0; const ScriptMethod* scriptMethods() const { return this->_scriptMethods; } protected: ScriptClass(const std::string& name, const ClassID& classID, ScriptMethod* scriptMethods); private: ClassID _classID; ScriptMethod* _scriptMethods; }; template class tScriptClass : public ScriptClass { public: tScriptClass(const std::string& name, ClassID classID, ScriptMethod* scriptMethods) : ScriptClass(name, classID, scriptMethods) { } virtual void registerClass(Script* script) { Lunar::Register(script, this->getName(), this->scriptMethods()); } virtual int insertObject(Script* L, BaseObject* obj, bool gc=false) { return Lunar::insertObject(L, dynamic_cast(obj), obj->getName(), gc); } virtual int insertObject(Script* L, BaseObject* obj,const std::string& name, bool gc=false) { return Lunar::insertObject(L, dynamic_cast(obj), name, gc); } }; #endif /* _SCRIPT_CLASS_H */