During application boot, plugins are initialized based on their attributes:
class PluginHandler{ public function boot(Application $app): void { foreach ($this->registry->all() as $class) { $class::boot($this->handle(...), $app); } }}
The ModuleRegistry provides methods to access module information:
class ModuleRegistry{ // Get a module by name public function module(?string $name = null): ?ModuleConfig // Get module from a file path public function moduleForPath(string $path): ?ModuleConfig // Get module from a class name public function moduleForClass(string $fqcn): ?ModuleConfig // Get all modules public function modules(): Collection // Reload modules from disk public function reload(): Collection}
use InterNACHI\Modular\Support\Facades\Modules;// Get a specific module$module = Modules::module('user-management');// Get all modules$all = Modules::modules();// Find module for a class$module = Modules::moduleForClass(App\Models\User::class);// Get module path$path = $module->path('src/Models');
The FinderFactory creates specialized finders for different file types:
class FinderFactory{ public function moduleComposerFileFinder(): FinderCollection public function commandFileFinder(): FinderCollection public function routeFileFinder(): FinderCollection public function viewDirectoryFinder(): FinderCollection public function migrationDirectoryFinder(): FinderCollection public function modelFileFinder(): FinderCollection public function bladeComponentFileFinder(): FinderCollection public function langDirectoryFinder(): FinderCollection public function listenerDirectoryFinder(): FinderCollection}
Each finder is pre-configured with the correct depth and patterns for its file type, ensuring consistent discovery across all modules.