00001 #ifndef _register_hh_ 00002 #define _register_hh_ 00003 00004 #include <string> 00005 #include "loader.hh" 00006 #include "stringhash.hh" 00007 00008 namespace anoid { 00009 namespace loader { 00010 00011 class RegisterBase { 00012 private: 00013 const std::string _name; 00014 public: 00015 explicit RegisterBase(const char *name); 00016 virtual Base *instantiate() const = 0; 00017 }; 00018 00019 00020 template <class T> 00021 class _Register: public RegisterBase { 00022 public: 00023 explicit _Register(const char *name): RegisterBase(name) {} 00024 virtual Base *instantiate() const { return new T; } 00025 }; 00026 00027 extern Loader loader; 00028 00029 }; 00030 }; 00031 00036 #define Register(Class) static ::anoid::loader::_Register<Class> _register##Class(#Class); 00037 00038 #endif