3--! \brief Plugins
module for FrameworkZ. Extends the framework with modular plugins.
4--! \class FrameworkZ.Plugins
6FrameworkZ.Plugins.__index = FrameworkZ.Plugins
7FrameworkZ.Plugins.RegisteredPlugins = {}
8FrameworkZ.Plugins.Commands = {}
9FrameworkZ.Plugins.LoadedPlugins = {}
10FrameworkZ.Plugins.EventHandlers = {}
11FrameworkZ.Plugins = FrameworkZ.Foundation:NewModule(FrameworkZ.Plugins, "Plugins")
13-- Define the base plugin metatable
14FrameworkZ.Plugins.BasePlugin = {}
15FrameworkZ.Plugins.BasePlugin.__index = FrameworkZ.Plugins.BasePlugin
17-- Function to initialize a new plugin
18function FrameworkZ.Plugins:CreatePlugin(name)
19 local plugin = setmetatable({}, self.BasePlugin)
23 Description = "No description set.",
31-- TODO add to FrameworkZ.Utilities library?
32local function mergeTables(t1, t2)
33 for k, v in pairs(t2) do
34 if type(v) == "table" and type(t1[k]) == "table" then
44--! \brief Register a plugin.
45--! \param pluginName \string The name of the plugin.
46--! \param pluginTable \table The table containing the plugin's functions and data.
47--! \param metadata \table Optional metadata for the plugin.
48function FrameworkZ.Plugins:RegisterPlugin(plugin, overwrite)
49 local name = plugin.Meta.Name
51 if not self.RegisteredPlugins[name] or overwrite then
52 self.RegisteredPlugins[name] = plugin
53 FrameworkZ.Foundation:RegisterPluginHandler(self.RegisteredPlugins[name])
55 FrameworkZ.Foundation:UnregisterPluginHandler(self.RegisteredPlugins[name])
56 self.RegisteredPlugins[name] = mergeTables(self.RegisteredPlugins[name], plugin)
57 FrameworkZ.Foundation:RegisterPluginHandler(self.RegisteredPlugins[name])
63function FrameworkZ.Plugins:GetPlugin(pluginName)
64 return self.RegisteredPlugins[pluginName]
67--! \brief Load a registered plugin.
68--! \param pluginName \string The name of the plugin to load.
69function FrameworkZ.Plugins:LoadPlugin(pluginName)
70 local plugin = self.RegisteredPlugins[pluginName]
71 if plugin and not self.LoadedPlugins[pluginName] then
72 if plugin.Initialize then
76 self.LoadedPlugins[pluginName] = plugin
77 --self:RegisterPluginEventHandlers(plugin)
81--! \brief Unload a loaded plugin.
82--! \param pluginName \string The name of the plugin to unload.
83function FrameworkZ.Plugins:UnloadPlugin(pluginName)
84 local plugin = self.LoadedPlugins[pluginName]
86 self:UnregisterPluginEventHandlers(plugin)
88 if plugin.Cleanup then
92 self.LoadedPlugins[pluginName] = nil
96--! \brief Register event handlers for a plugin.
97--! \param plugin \table The plugin table containing the functions.
98function FrameworkZ.Plugins:RegisterPluginEventHandlers(plugin)
99 for _, eventName in ipairs(self.EventHandlers) do
100 if plugin[eventName] then
101 FrameworkZ.Hooks:RegisterHandler(eventName, plugin[eventName], plugin, eventName)
106--! \brief Unregister event handlers for a plugin.
107--! \param plugin \table The plugin table containing the functions.
108function FrameworkZ.Plugins:UnregisterPluginEventHandlers(plugin)
109 for _, eventName in ipairs(self.EventHandlers) do
110 if plugin[eventName] then
111 FrameworkZ.Hooks:UnregisterHandler(eventName, plugin[eventName], plugin, eventName)
116--! \brief Add a new event handler to the list.
117--! \param eventName \string The name of the event handler to add.
118function FrameworkZ.Plugins:AddEventHandler(eventName)
119 table.insert(self.EventHandlers, eventName)
122--! \brief Remove an event handler from the list.
123--! \param eventName \string The name of the event handler to remove.
124function FrameworkZ.Plugins:RemoveEventHandler(eventName)
125 for i, handler in ipairs(self.EventHandlers) do
126 if handler == eventName then
127 table.remove(self.EventHandlers, i)
133--! \brief Unregister a specific hook for a plugin.
134--! \param pluginName \string The name of the plugin.
135--! \param hookName \string The name of the hook to unregister.
136function FrameworkZ.Plugins:UnregisterPluginHook(pluginName, hookName)
137 local plugin = self.LoadedPlugins[pluginName]
138 if plugin and plugin[hookName] then
139 FrameworkZ.Hooks:UnregisterHandler(hookName, plugin[hookName], plugin, hookName)
140 plugin[hookName] = nil
144--! \brief Execute a hook for all loaded plugins.
145--! \param hookName \string The name of the hook to execute.
146--! \param ... \vararg Additional arguments to pass to the hook functions.
147function FrameworkZ.Plugins:ExecutePluginHook(hookName, ...)
148 for pluginName, plugin in pairs(self.LoadedPlugins) do
149 if plugin[hookName] then
150 local handlers = FrameworkZ.Hooks.RegisteredHooks[hookName]
153 for _, handler in ipairs(handlers) do
154 if handler.object and handler.functionName then
157 plugin[hookName](...)
165--! \brief Log a message for debugging purposes.
166--! \param message \string The message to log.
167function FrameworkZ.Plugins:Log(message)
168 print("[FrameworkZ.Plugins] " .. message)
171--! \brief Register a custom command for a plugin.
172--! \param commandName \string The name of the command.
173--! \param callback \function The function to call when the command is executed.
174function FrameworkZ.Plugins:RegisterCommand(commandName, callback)
175 if not self.Commands then
178 self.Commands[commandName] = callback
181--! \brief Execute a custom command.
182--! \param commandName \string The name of the command.
183--! \param ... \vararg Additional arguments to pass to the command function.
184function FrameworkZ.Plugins:ExecuteCommand(commandName, ...)
185 local command = self.Commands and self.Commands[commandName]
189 print("Command not found:", commandName)
Plugins module for FrameworkZ. Extends the framework with modular plugins.
FrameworkZ Plugins RegisteredPlugins
void RegisterPlugin(plugin, overwrite)
Register a plugin.
void UnregisterPluginEventHandlers(plugin)
Unregister event handlers for a plugin.
void AddEventHandler(eventName)
Add a new event handler to the list.
void RemoveEventHandler(eventName)
Remove an event handler from the list.
FrameworkZ Plugins __index
void UnloadPlugin(pluginName)
Unload a loaded plugin.
void RegisterCommand(commandName, callback)
Register a custom command for a plugin.
FrameworkZ Plugins BasePlugin
void Log(message)
Log a message for debugging purposes.
void ExecuteCommand(commandName,...)
Execute a custom command.
void ExecutePluginHook(hookName,...)
Execute a hook for all loaded plugins.
void GetPlugin(pluginName)
FrameworkZ Plugins EventHandlers
void UnregisterPluginHook(pluginName, hookName)
Unregister a specific hook for a plugin.
void LoadPlugin(pluginName)
Load a registered plugin.
void RegisterPluginEventHandlers(plugin)
Register event handlers for a plugin.
FrameworkZ Plugins LoadedPlugins
FrameworkZ Plugins Commands