changeset 836:e7a37a331753

irccd: pass plugin by reference in javascript api
author David Demelier <markand@malikania.fr>
date Thu, 25 Apr 2019 20:59:32 +0200
parents 62c34f1e44e2
children eeb0bc58cd76
files libirccd-js/irccd/js/api.hpp libirccd-js/irccd/js/directory_api.cpp libirccd-js/irccd/js/directory_api.hpp libirccd-js/irccd/js/elapsed_timer_api.cpp libirccd-js/irccd/js/elapsed_timer_api.hpp libirccd-js/irccd/js/file_api.cpp libirccd-js/irccd/js/file_api.hpp libirccd-js/irccd/js/irccd_api.cpp libirccd-js/irccd/js/irccd_api.hpp libirccd-js/irccd/js/logger_api.cpp libirccd-js/irccd/js/logger_api.hpp libirccd-js/irccd/js/plugin.cpp libirccd-js/irccd/js/plugin_api.cpp libirccd-js/irccd/js/plugin_api.hpp libirccd-js/irccd/js/server_api.cpp libirccd-js/irccd/js/server_api.hpp libirccd-js/irccd/js/system_api.cpp libirccd-js/irccd/js/system_api.hpp libirccd-js/irccd/js/timer_api.cpp libirccd-js/irccd/js/timer_api.hpp libirccd-js/irccd/js/unicode_api.cpp libirccd-js/irccd/js/unicode_api.hpp libirccd-js/irccd/js/util_api.cpp libirccd-js/irccd/js/util_api.hpp libirccd-test/irccd/test/js_fixture.cpp libirccd-test/irccd/test/js_plugin_fixture.cpp tests/src/libirccd-js/js-plugin/main.cpp
diffstat 27 files changed, 173 insertions(+), 173 deletions(-) [+]
line wrap: on
line diff
--- a/libirccd-js/irccd/js/api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -82,7 +82,7 @@
 	 * \param bot the irccd instance
 	 * \param plugin the plugin
 	 */
-	virtual void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) = 0;
+	virtual void load(daemon::bot& bot, js::plugin& plugin) = 0;
 };
 
 } // !js
--- a/libirccd-js/irccd/js/directory_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/directory_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -377,28 +377,28 @@
 	return "Irccd.Directory";
 }
 
-void directory_api::load(daemon::bot&, std::shared_ptr<plugin> plugin)
+void directory_api::load(daemon::bot&, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
-	duk_get_global_string(plugin->get_context(), "Irccd");
-	duk_push_c_function(plugin->get_context(), Directory_constructor, 2);
-	duk_put_number_list(plugin->get_context(), -1, constants);
-	duk_put_function_list(plugin->get_context(), -1, functions);
+	duk_get_global_string(plugin.get_context(), "Irccd");
+	duk_push_c_function(plugin.get_context(), Directory_constructor, 2);
+	duk_put_number_list(plugin.get_context(), -1, constants);
+	duk_put_function_list(plugin.get_context(), -1, functions);
 
 #if BOOST_OS_WINDOWS
-	duk_push_string(plugin->get_context(), "\\");
+	duk_push_string(plugin.get_context(), "\\");
 #else
-	duk_push_string(plugin->get_context(), "/");
+	duk_push_string(plugin.get_context(), "/");
 #endif
 
-	duk_put_prop_string(plugin->get_context(), -2, "separator");
+	duk_put_prop_string(plugin.get_context(), -2, "separator");
 
-	duk_push_object(plugin->get_context());
-	duk_put_function_list(plugin->get_context(), -1, methods);
-	duk_put_prop_string(plugin->get_context(), -2, "prototype");
-	duk_put_prop_string(plugin->get_context(), -2, "Directory");
-	duk_pop(plugin->get_context());
+	duk_push_object(plugin.get_context());
+	duk_put_function_list(plugin.get_context(), -1, methods);
+	duk_put_prop_string(plugin.get_context(), -2, "prototype");
+	duk_put_prop_string(plugin.get_context(), -2, "Directory");
+	duk_pop(plugin.get_context());
 }
 
 // }}}
--- a/libirccd-js/irccd/js/directory_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/directory_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -42,7 +42,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/elapsed_timer_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/elapsed_timer_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -162,19 +162,19 @@
 	return "Irccd.ElapsedTimer";
 }
 
-void elapsed_timer_api::load(bot&, std::shared_ptr<plugin> plugin)
+void elapsed_timer_api::load(bot&, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
-	duk_get_global_string(plugin->get_context(), "Irccd");
-	duk_push_c_function(plugin->get_context(), ElapsedTimer_constructor, 0);
-	duk_push_object(plugin->get_context());
-	duk_put_function_list(plugin->get_context(), -1, methods);
-	duk_push_c_function(plugin->get_context(), ElapsedTimer_destructor, 1);
-	duk_set_finalizer(plugin->get_context(), -2);
-	duk_put_prop_string(plugin->get_context(), -2, "prototype");
-	duk_put_prop_string(plugin->get_context(), -2, "ElapsedTimer");
-	duk_pop(plugin->get_context());
+	duk_get_global_string(plugin.get_context(), "Irccd");
+	duk_push_c_function(plugin.get_context(), ElapsedTimer_constructor, 0);
+	duk_push_object(plugin.get_context());
+	duk_put_function_list(plugin.get_context(), -1, methods);
+	duk_push_c_function(plugin.get_context(), ElapsedTimer_destructor, 1);
+	duk_set_finalizer(plugin.get_context(), -2);
+	duk_put_prop_string(plugin.get_context(), -2, "prototype");
+	duk_put_prop_string(plugin.get_context(), -2, "ElapsedTimer");
+	duk_pop(plugin.get_context());
 }
 
 // }}}
--- a/libirccd-js/irccd/js/elapsed_timer_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/elapsed_timer_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -42,7 +42,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/file_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/file_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -683,23 +683,23 @@
 	return "Irccd.File";
 }
 
-void file_api::load(bot&, std::shared_ptr<plugin> plugin)
+void file_api::load(bot&, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
-	duk_get_global_string(plugin->get_context(), "Irccd");
-	duk_push_c_function(plugin->get_context(), File_constructor, 2);
-	duk_put_number_list(plugin->get_context(), -1, constants);
-	duk_put_function_list(plugin->get_context(), -1, functions);
-	duk_push_object(plugin->get_context());
-	duk_put_function_list(plugin->get_context(), -1, methods);
-	duk_push_c_function(plugin->get_context(), File_destructor, 1);
-	duk_set_finalizer(plugin->get_context(), -2);
-	duk_dup(plugin->get_context(), -1);
-	duk_put_global_string(plugin->get_context(), prototype.data());
-	duk_put_prop_string(plugin->get_context(), -2, "prototype");
-	duk_put_prop_string(plugin->get_context(), -2, "File");
-	duk_pop(plugin->get_context());
+	duk_get_global_string(plugin.get_context(), "Irccd");
+	duk_push_c_function(plugin.get_context(), File_constructor, 2);
+	duk_put_number_list(plugin.get_context(), -1, constants);
+	duk_put_function_list(plugin.get_context(), -1, functions);
+	duk_push_object(plugin.get_context());
+	duk_put_function_list(plugin.get_context(), -1, methods);
+	duk_push_c_function(plugin.get_context(), File_destructor, 1);
+	duk_set_finalizer(plugin.get_context(), -2);
+	duk_dup(plugin.get_context(), -1);
+	duk_put_global_string(plugin.get_context(), prototype.data());
+	duk_put_prop_string(plugin.get_context(), -2, "prototype");
+	duk_put_prop_string(plugin.get_context(), -2, "File");
+	duk_pop(plugin.get_context());
 }
 
 // }}}
--- a/libirccd-js/irccd/js/file_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/file_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -153,7 +153,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 namespace duk {
--- a/libirccd-js/irccd/js/irccd_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/irccd_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -190,46 +190,46 @@
 	return "Irccd";
 }
 
-void irccd_api::load(bot& bot, std::shared_ptr<plugin> plugin)
+void irccd_api::load(bot& bot, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
 	// irccd.
-	duk_push_object(plugin->get_context());
+	duk_push_object(plugin.get_context());
 
 	// Version.
-	duk_push_object(plugin->get_context());
-	duk::push(plugin->get_context(), IRCCD_VERSION_MAJOR);
-	duk_put_prop_string(plugin->get_context(), -2, "major");
-	duk::push(plugin->get_context(), IRCCD_VERSION_MINOR);
-	duk_put_prop_string(plugin->get_context(), -2, "minor");
-	duk::push(plugin->get_context(), IRCCD_VERSION_PATCH);
-	duk_put_prop_string(plugin->get_context(), -2, "patch");
-	duk_put_prop_string(plugin->get_context(), -2, "version");
+	duk_push_object(plugin.get_context());
+	duk::push(plugin.get_context(), IRCCD_VERSION_MAJOR);
+	duk_put_prop_string(plugin.get_context(), -2, "major");
+	duk::push(plugin.get_context(), IRCCD_VERSION_MINOR);
+	duk_put_prop_string(plugin.get_context(), -2, "minor");
+	duk::push(plugin.get_context(), IRCCD_VERSION_PATCH);
+	duk_put_prop_string(plugin.get_context(), -2, "patch");
+	duk_put_prop_string(plugin.get_context(), -2, "version");
 
 	// Create the system_error that inherits from Error.
-	duk_push_c_function(plugin->get_context(), SystemError_constructor, 2);
+	duk_push_c_function(plugin.get_context(), SystemError_constructor, 2);
 
 	// Put errno codes into the irccd.system_error object.
 	for (const auto& [k, v] : errors) {
-		duk_push_int(plugin->get_context(), v);
-		duk_put_prop_string(plugin->get_context(), -2, k.c_str());
+		duk_push_int(plugin.get_context(), v);
+		duk_put_prop_string(plugin.get_context(), -2, k.c_str());
 	}
 
-	duk_push_object(plugin->get_context());
-	duk_get_global_string(plugin->get_context(), "Error");
-	duk_get_prop_string(plugin->get_context(), -1, "prototype");
-	duk_remove(plugin->get_context(), -2);
-	duk_set_prototype(plugin->get_context(), -2);
-	duk_put_prop_string(plugin->get_context(), -2, "prototype");
-	duk_put_prop_string(plugin->get_context(), -2, "SystemError");
+	duk_push_object(plugin.get_context());
+	duk_get_global_string(plugin.get_context(), "Error");
+	duk_get_prop_string(plugin.get_context(), -1, "prototype");
+	duk_remove(plugin.get_context(), -2);
+	duk_set_prototype(plugin.get_context(), -2);
+	duk_put_prop_string(plugin.get_context(), -2, "prototype");
+	duk_put_prop_string(plugin.get_context(), -2, "SystemError");
 
 	// Set irccd as global.
-	duk_put_global_string(plugin->get_context(), "Irccd");
+	duk_put_global_string(plugin.get_context(), "Irccd");
 
 	// Store global instance.
-	duk_push_pointer(plugin->get_context(), &bot);
-	duk_put_global_string(plugin->get_context(), DUK_HIDDEN_SYMBOL("irccd-ref"));
+	duk_push_pointer(plugin.get_context(), &bot);
+	duk_put_global_string(plugin.get_context(), DUK_HIDDEN_SYMBOL("irccd-ref"));
 }
 
 auto duk::type_traits<bot>::self(duk_context *ctx) -> bot&
--- a/libirccd-js/irccd/js/irccd_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/irccd_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -55,7 +55,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 namespace duk {
--- a/libirccd-js/irccd/js/logger_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/logger_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -135,15 +135,15 @@
 	return "Irccd.Logger";
 }
 
-void logger_api::load(bot&, std::shared_ptr<plugin> plugin)
+void logger_api::load(bot&, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
-	duk_get_global_string(plugin->get_context(), "Irccd");
-	duk_push_object(plugin->get_context());
-	duk_put_function_list(plugin->get_context(), -1, functions);
-	duk_put_prop_string(plugin->get_context(), -2, "Logger");
-	duk_pop(plugin->get_context());
+	duk_get_global_string(plugin.get_context(), "Irccd");
+	duk_push_object(plugin.get_context());
+	duk_put_function_list(plugin.get_context(), -1, functions);
+	duk_put_prop_string(plugin.get_context(), -2, "Logger");
+	duk_pop(plugin.get_context());
 }
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/logger_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/logger_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -42,7 +42,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/plugin.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/plugin.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -357,7 +357,7 @@
 	auto plg = std::make_shared<plugin>(std::string(id), std::string(path));
 
 	for (const auto& mod : modules_)
-		mod->load(bot_, plg);
+		mod->load(bot_, *plg);
 
 	plg->open();
 
--- a/libirccd-js/irccd/js/plugin_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/plugin_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -385,48 +385,48 @@
 	return "Irccd.Plugin";
 }
 
-void plugin_api::load(bot&, std::shared_ptr<plugin> plugin)
+void plugin_api::load(bot&, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
 	// Store plugin.
-	duk_push_pointer(plugin->get_context(), plugin.get());
-	duk_put_global_string(plugin->get_context(), signature.data());
+	duk_push_pointer(plugin.get_context(), &plugin);
+	duk_put_global_string(plugin.get_context(), signature.data());
 
-	duk_get_global_string(plugin->get_context(), "Irccd");
-	duk_push_object(plugin->get_context());
-	duk_put_function_list(plugin->get_context(), -1, functions);
+	duk_get_global_string(plugin.get_context(), "Irccd");
+	duk_push_object(plugin.get_context());
+	duk_put_function_list(plugin.get_context(), -1, functions);
 
 	// 'config' property.
-	duk_push_string(plugin->get_context(), "config");
-	duk_push_c_function(plugin->get_context(), get_config, 0);
-	duk_push_c_function(plugin->get_context(), set_config, 1);
-	duk_def_prop(plugin->get_context(), -4, DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER);
+	duk_push_string(plugin.get_context(), "config");
+	duk_push_c_function(plugin.get_context(), get_config, 0);
+	duk_push_c_function(plugin.get_context(), set_config, 1);
+	duk_def_prop(plugin.get_context(), -4, DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER);
 
 	// 'format' property.
-	duk_push_string(plugin->get_context(), "format");
-	duk_push_c_function(plugin->get_context(), get_format, 0);
-	duk_push_c_function(plugin->get_context(), set_format, 1);
-	duk_def_prop(plugin->get_context(), -4, DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER);
+	duk_push_string(plugin.get_context(), "format");
+	duk_push_c_function(plugin.get_context(), get_format, 0);
+	duk_push_c_function(plugin.get_context(), set_format, 1);
+	duk_def_prop(plugin.get_context(), -4, DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER);
 
 	// 'format' property.
-	duk_push_string(plugin->get_context(), "paths");
-	duk_push_c_function(plugin->get_context(), get_paths, 0);
-	duk_push_c_function(plugin->get_context(), set_paths, 1);
-	duk_def_prop(plugin->get_context(), -4, DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER);
+	duk_push_string(plugin.get_context(), "paths");
+	duk_push_c_function(plugin.get_context(), get_paths, 0);
+	duk_push_c_function(plugin.get_context(), set_paths, 1);
+	duk_def_prop(plugin.get_context(), -4, DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER);
 
 	// PluginError function.
-	duk_push_c_function(plugin->get_context(), PluginError_constructor, 2);
-	duk_push_object(plugin->get_context());
-	duk_get_global_string(plugin->get_context(), "Error");
-	duk_get_prop_string(plugin->get_context(), -1, "prototype");
-	duk_remove(plugin->get_context(), -2);
-	duk_set_prototype(plugin->get_context(), -2);
-	duk_put_prop_string(plugin->get_context(), -2, "prototype");
-	duk_put_prop_string(plugin->get_context(), -2, "PluginError");
+	duk_push_c_function(plugin.get_context(), PluginError_constructor, 2);
+	duk_push_object(plugin.get_context());
+	duk_get_global_string(plugin.get_context(), "Error");
+	duk_get_prop_string(plugin.get_context(), -1, "prototype");
+	duk_remove(plugin.get_context(), -2);
+	duk_set_prototype(plugin.get_context(), -2);
+	duk_put_prop_string(plugin.get_context(), -2, "prototype");
+	duk_put_prop_string(plugin.get_context(), -2, "PluginError");
 
-	duk_put_prop_string(plugin->get_context(), -2, "Plugin");
-	duk_pop(plugin->get_context());
+	duk_put_prop_string(plugin.get_context(), -2, "Plugin");
+	duk_pop(plugin.get_context());
 }
 
 namespace duk {
--- a/libirccd-js/irccd/js/plugin_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/plugin_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -43,7 +43,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 namespace duk {
--- a/libirccd-js/irccd/js/server_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/server_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -821,34 +821,34 @@
 	return "Irccd.Server";
 }
 
-void server_api::load(bot&, std::shared_ptr<plugin> plugin)
+void server_api::load(bot&, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
-	duk_get_global_string(plugin->get_context(), "Irccd");
+	duk_get_global_string(plugin.get_context(), "Irccd");
 
 	// ServerError function.
-	duk_push_c_function(plugin->get_context(), ServerError_constructor, 2);
-	duk_push_object(plugin->get_context());
-	duk_get_global_string(plugin->get_context(), "Error");
-	duk_get_prop_string(plugin->get_context(), -1, "prototype");
-	duk_remove(plugin->get_context(), -2);
-	duk_set_prototype(plugin->get_context(), -2);
-	duk_put_prop_string(plugin->get_context(), -2, "prototype");
-	duk_put_prop_string(plugin->get_context(), -2, "ServerError");
+	duk_push_c_function(plugin.get_context(), ServerError_constructor, 2);
+	duk_push_object(plugin.get_context());
+	duk_get_global_string(plugin.get_context(), "Error");
+	duk_get_prop_string(plugin.get_context(), -1, "prototype");
+	duk_remove(plugin.get_context(), -2);
+	duk_set_prototype(plugin.get_context(), -2);
+	duk_put_prop_string(plugin.get_context(), -2, "prototype");
+	duk_put_prop_string(plugin.get_context(), -2, "ServerError");
 
 	// Server constructor.
-	duk_push_c_function(plugin->get_context(), Server_constructor, 1);
-	duk_put_function_list(plugin->get_context(), -1, functions);
-	duk_push_object(plugin->get_context());
-	duk_put_function_list(plugin->get_context(), -1, methods);
-	duk_push_c_function(plugin->get_context(), Server_destructor, 1);
-	duk_set_finalizer(plugin->get_context(), -2);
-	duk_dup_top(plugin->get_context());
-	duk_put_global_string(plugin->get_context(), prototype.data());
-	duk_put_prop_string(plugin->get_context(), -2, "prototype");
-	duk_put_prop_string(plugin->get_context(), -2, "Server");
-	duk_pop(plugin->get_context());
+	duk_push_c_function(plugin.get_context(), Server_constructor, 1);
+	duk_put_function_list(plugin.get_context(), -1, functions);
+	duk_push_object(plugin.get_context());
+	duk_put_function_list(plugin.get_context(), -1, methods);
+	duk_push_c_function(plugin.get_context(), Server_destructor, 1);
+	duk_set_finalizer(plugin.get_context(), -2);
+	duk_dup_top(plugin.get_context());
+	duk_put_global_string(plugin.get_context(), prototype.data());
+	duk_put_prop_string(plugin.get_context(), -2, "prototype");
+	duk_put_prop_string(plugin.get_context(), -2, "Server");
+	duk_pop(plugin.get_context());
 }
 
 namespace duk {
--- a/libirccd-js/irccd/js/server_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/server_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -44,7 +44,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 namespace duk {
--- a/libirccd-js/irccd/js/system_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/system_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -318,15 +318,15 @@
 	return "Irccd.System";
 }
 
-void system_api::load(bot&, std::shared_ptr<plugin> plugin)
+void system_api::load(bot&, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
-	duk_get_global_string(plugin->get_context(), "Irccd");
-	duk_push_object(plugin->get_context());
-	duk_put_function_list(plugin->get_context(), -1, functions);
-	duk_put_prop_string(plugin->get_context(), -2, "System");
-	duk_pop(plugin->get_context());
+	duk_get_global_string(plugin.get_context(), "Irccd");
+	duk_push_object(plugin.get_context());
+	duk_put_function_list(plugin.get_context(), -1, functions);
+	duk_put_prop_string(plugin.get_context(), -2, "System");
+	duk_pop(plugin.get_context());
 }
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/system_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/system_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -42,7 +42,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/timer_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/timer_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -295,22 +295,22 @@
 	return "Irccd.Timer";
 }
 
-void timer_api::load(bot&, std::shared_ptr<plugin> plugin)
+void timer_api::load(bot&, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
-	duk_get_global_string(plugin->get_context(), "Irccd");
-	duk_push_c_function(plugin->get_context(), Timer_constructor, 3);
-	duk_put_number_list(plugin->get_context(), -1, constants);
-	duk_push_object(plugin->get_context());
-	duk_put_function_list(plugin->get_context(), -1, methods);
-	duk_put_prop_string(plugin->get_context(), -2, "prototype");
-	duk_put_prop_string(plugin->get_context(), -2, "Timer");
-	duk_pop(plugin->get_context());
-	duk_push_global_stash(plugin->get_context());
-	duk_push_object(plugin->get_context());
-	duk_put_prop_string(plugin->get_context(), -2, table.data());
-	duk_pop(plugin->get_context());
+	duk_get_global_string(plugin.get_context(), "Irccd");
+	duk_push_c_function(plugin.get_context(), Timer_constructor, 3);
+	duk_put_number_list(plugin.get_context(), -1, constants);
+	duk_push_object(plugin.get_context());
+	duk_put_function_list(plugin.get_context(), -1, methods);
+	duk_put_prop_string(plugin.get_context(), -2, "prototype");
+	duk_put_prop_string(plugin.get_context(), -2, "Timer");
+	duk_pop(plugin.get_context());
+	duk_push_global_stash(plugin.get_context());
+	duk_push_object(plugin.get_context());
+	duk_put_prop_string(plugin.get_context(), -2, table.data());
+	duk_pop(plugin.get_context());
 }
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/timer_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/timer_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -42,7 +42,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/unicode_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/unicode_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -151,15 +151,15 @@
 	return "Irccd.Unicode";
 }
 
-void unicode_api::load(bot&, std::shared_ptr<plugin> plugin)
+void unicode_api::load(bot&, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
-	duk_get_global_string(plugin->get_context(), "Irccd");
-	duk_push_object(plugin->get_context());
-	duk_put_function_list(plugin->get_context(), -1, functions);
-	duk_put_prop_string(plugin->get_context(), -2, "Unicode");
-	duk_pop(plugin->get_context());
+	duk_get_global_string(plugin.get_context(), "Irccd");
+	duk_push_object(plugin.get_context());
+	duk_put_function_list(plugin.get_context(), -1, functions);
+	duk_put_prop_string(plugin.get_context(), -2, "Unicode");
+	duk_pop(plugin.get_context());
 }
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/unicode_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/unicode_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -42,7 +42,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/util_api.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/util_api.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -340,15 +340,15 @@
 	return "Irccd.Util";
 }
 
-void util_api::load(bot&, std::shared_ptr<plugin> plugin)
+void util_api::load(bot&, plugin& plugin)
 {
-	duk::stack_guard sa(plugin->get_context());
+	duk::stack_guard sa(plugin.get_context());
 
-	duk_get_global_string(plugin->get_context(), "Irccd");
-	duk_push_object(plugin->get_context());
-	duk_put_function_list(plugin->get_context(), -1, functions);
-	duk_put_prop_string(plugin->get_context(), -2, "Util");
-	duk_pop(plugin->get_context());
+	duk_get_global_string(plugin.get_context(), "Irccd");
+	duk_push_object(plugin.get_context());
+	duk_put_function_list(plugin.get_context(), -1, functions);
+	duk_put_prop_string(plugin.get_context(), -2, "Util");
+	duk_pop(plugin.get_context());
 }
 
 } // !irccd::js
--- a/libirccd-js/irccd/js/util_api.hpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-js/irccd/js/util_api.hpp	Thu Apr 25 20:59:32 2019 +0200
@@ -42,7 +42,7 @@
 	/**
 	 * \copydoc api::load
 	 */
-	void load(daemon::bot& bot, std::shared_ptr<plugin> plugin) override;
+	void load(daemon::bot& bot, js::plugin& plugin) override;
 };
 
 } // !irccd::js
--- a/libirccd-test/irccd/test/js_fixture.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-test/irccd/test/js_fixture.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -24,7 +24,7 @@
 	: plugin_(new js::plugin("test", path))
 {
 	for (const auto& f : js::api::registry())
-		f()->load(bot_, plugin_);
+		f()->load(bot_, *plugin_);
 
 	if (!path.empty())
 		plugin_->open();
--- a/libirccd-test/irccd/test/js_plugin_fixture.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/libirccd-test/irccd/test/js_plugin_fixture.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -58,7 +58,7 @@
 	server_->clear();
 
 	for (const auto& f : js::api::registry())
-		f()->load(bot_, plugin_);
+		f()->load(bot_, *plugin_);
 
 	plugin_->open();
 }
--- a/tests/src/libirccd-js/js-plugin/main.cpp	Thu Apr 25 20:58:42 2019 +0200
+++ b/tests/src/libirccd-js/js-plugin/main.cpp	Thu Apr 25 20:59:32 2019 +0200
@@ -44,7 +44,7 @@
 		plugin_ = std::make_unique<plugin>("test", path);
 
 		for (const auto& f : api::registry())
-			f()->load(bot_, plugin_);
+			f()->load(bot_, *plugin_);
 
 		plugin_->open();
 	}