diff --git a/src/common/Module.cpp b/src/common/Module.cpp new file mode 100644 index 000000000..48f220fa8 --- /dev/null +++ b/src/common/Module.cpp @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2006-2012 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "Module.h" +#include "Exception.h" + +// std +#include +#include +#include + +namespace +{ + std::map registry; +} // anonymous namespace + +namespace love +{ + void Module::registerInstance(Module *instance) + { + if (instance == NULL) + throw Exception("Module instance is NULL"); + + std::string name(instance->getName()); + + std::map::iterator it = registry.find(name); + if (registry.end() != it) + throw Exception("Module %s already registered!", instance->getName()); + + registry.insert(make_pair(name, instance)); + } + + Module *Module::getInstance(const char *name) + { + std::map::iterator it = registry.find(std::string(name)); + + if (registry.end() == it) + return NULL; + + return it->second; + } +} // namespace love diff --git a/src/common/Module.h b/src/common/Module.h index a1f98711a..0e36ddac1 100644 --- a/src/common/Module.h +++ b/src/common/Module.h @@ -48,6 +48,21 @@ public: **/ virtual const char *getName() const = 0; + /** + * Add module to internal registry. To be used /only/ in + * runtime.cpp:luax_register_module() + * @param instance The module instance. + */ + static void registerInstance(Module *instance); + + /** + * Retrieve module instance from internal registry. May return NULL + * if module not registered. + * @param name The full name of the module. + * @returns Module instance of NULL if the module is not registered. + */ + static Module *getInstance(const char *name); + }; // Module } // love diff --git a/src/common/runtime.cpp b/src/common/runtime.cpp index 5216890b6..11738b1eb 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -191,6 +191,9 @@ int luax_register_module(lua_State *L, const WrappedModule &m) lua_setfield(L, -3, m.name); // love.graphics = table lua_remove(L, -2); // love + // Register module instance + Module::registerInstance(m.module); + return 1; }