# Handlers

URL: https://zerodev.ca/docs/kora/developer-documentation/handlers

> Where your module's logic lives, shared by routes, clocks, events and commands.



A handler holds your module's logic. Routes, clocks, events and commands stay short and call into it. Put handlers in `src/handlers/`.

```js title="modules/example/src/handlers/Items.js"
import { Handlers } from "#kora/modules";

export class Items extends Handlers {
    constructor(kora) {
        super(kora, { name: "items" });
    }

    get items() {
        return this.kora.modules.models.get(this.module, "example_items");
    }

    async create(identifier, name) {
        if (!identifier) this.fail(400, "An identifier is required.");
        if (await this.items.get({ identifier })) this.fail(409, `${identifier} already exists.`);
        return this.items.create({ identifier, name });
    }

    async remove(identifier) {
        if (!await this.items.delete({ identifier })) this.fail(404, `${identifier} was not found.`);
        return { removed: identifier };
    }
}
```

`this.module` is your module ID, set by Kora when it loads the file.

## Methods

| Method                      | What it does                                                                                                  |
| --------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `fail(status, message)`     | Throws an error with that HTTP status. A route that hits it answers with the status and `{ error: message }`. |
| `emit(event, ...args)`      | Fires an event on `this.kora.events`.                                                                         |
| `emitAsync(event, ...args)` | Fires an event and waits for every listener.                                                                  |
| `getName()`                 | The handler name.                                                                                             |

## Using Another Module's Handler

```js
const licenses = this.kora.modules.handlers.get("core", "licenses");
```

`get` returns `null` when that module is not installed. If your module cannot work without it, add it to `requires` in `main.js` instead of checking each time.
