Commits

vrld committed 3c6206d

Add Module::registerInstance() and Module::getInstance().

Module::registerInstance() registers a module instance which can later
be retrieved using Module::getInstance().

registerInstance() is called in luax_register_module().

getInstance() expects the full name (as returned by Module::getName())
of the requested module.

Comments (0)

Files changed (3)

src/common/Module.cpp

+/**
+ * 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 <map>
+#include <utility>
+#include <string>
+
+namespace
+{
+	std::map<std::string, love::Module*> 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<std::string, Module*>::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<std::string, Module*>::iterator it = registry.find(std::string(name));
+
+		if (registry.end() == it)
+			return NULL;
+
+		return it->second;
+	}
+} // namespace love

src/common/Module.h

 	 **/
 	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

src/common/runtime.cpp

 	lua_setfield(L, -3, m.name); // love.graphics = table
 	lua_remove(L, -2); // love
 
+	// Register module instance
+	Module::registerInstance(m.module);
+
 	return 1;
 }