# Modules

NOVA's module system allows you to extend the framework with custom functionality while maintaining proper load order.

## Built-in Modules

| Module        | Description                      |
| ------------- | -------------------------------- |
| `commands`    | Admin and utility commands       |
| `jobs`        | Job management and salary system |
| `permissions` | Permission checking and caching  |
| `vehiclekeys` | Vehicle key ownership system     |

## Creating a Module

### Basic Module

```lua
-- modules/mymodule/server.lua

Nova.RegisterModule('mymodule', {
    Init = function()
        print('[MyModule] Initializing...')
        -- Setup data, register events
    end,
    Start = function()
        print('[MyModule] Started!')
        -- Module is ready, can interact with other modules
    end,
})
```

### Module with Dependencies

```lua
Nova.RegisterModule('advanced', {
    dependencies = {'commands', 'permissions'},
    
    Init = function()
        -- This runs AFTER 'commands' and 'permissions' are initialized
    end,
    
    Start = function()
        -- Safe to use commands and permissions modules here
    end,
})
```

## Load Order

1. All modules register via `Nova.RegisterModule()`
2. NOVA resolves the dependency graph
3. `Init()` is called in dependency order (dependencies first)
4. After ALL modules init, `Start()` is called for each
5. `Nova:Ready` event fires

```
Register: commands, vehiclekeys, permissions, jobs
                    │
          Resolve Dependencies
                    │
    Init Order: permissions → commands → jobs → vehiclekeys
                    │
   Start Order: permissions → commands → jobs → vehiclekeys
                    │
              Nova:Ready event
```

## Module Communication

Modules can communicate through the shared `Nova` object:

```lua
-- Module A sets up a function
Nova.RegisterModule('moduleA', {
    Init = function()
        Nova.ModuleA = {}
        Nova.ModuleA.DoSomething = function()
            return 'Hello from Module A!'
        end
    end,
})

-- Module B uses it (depends on moduleA)
Nova.RegisterModule('moduleB', {
    dependencies = {'moduleA'},
    Start = function()
        local result = Nova.ModuleA.DoSomething()
        print(result)  -- 'Hello from Module A!'
    end,
})
```
