Im just looking for overall improvements on my module loader if anyone has any suggestions
-----------------------------
-- SERVICES --
-----------------------------
local runService = game:GetService("RunService")
-----------------------------
-- VARIABLES --
-----------------------------
local player
local warnIdentifier
local currentThread = coroutine.running()
local moduleLoader = {
Modules = {}
}
-----------------------------
-- PRIVATE FUNCTIONS --
-----------------------------
local function getModulesFolder()
if runService:IsClient() then
player = game.Players.LocalPlayer
warnIdentifier = "[C]"
return game.ReplicatedStorage.Modules.ClientModules
else
warnIdentifier = "[S]"
return game.ServerStorage.ServerModules
end
end
local function outputWarning (message)
warn(warnIdentifier ..": ".. message)
end
local function Require (moduleScript)
local requiredModule
local success, response = pcall(function()
requiredModule = require(moduleScript)
end)
if success then
moduleLoader.Modules[moduleScript.Name] = requiredModule
return requiredModule
else
outputWarning("Module script: " ..moduleScript.Name.. " could not be required. Reason: ".. response)
return
end
end
local function initializeModule (requiredModule)
if not requiredModule.Init then
return
end
local success, response = pcall(function()
requiredModule:Init(player)
end)
if not success then
outputWarning(response)
end
end
local function startModule (requiredModule)
if not requiredModule.Start then
return
end
local success, response = pcall(function()
requiredModule:Start()
end)
if not success then
warn(response)
end
end
-----------------------------
-- PUBLIC FUNCTIONS --
-----------------------------
function moduleLoader:startLoader ()
local modulesFolder = getModulesFolder()
for _, moduleScript in pairs(modulesFolder:GetDescendants()) do
if not moduleScript or not moduleScript:IsA("ModuleScript") then
continue
end
local requiredModule = Require(moduleScript)
if not requiredModule then
continue
end
initializeModule(requiredModule)
startModule(requiredModule)
end
end
function moduleLoader:Get(name)
return self.Modules[name]
end
return moduleLoader