# Spellframes and categories **Beginner.** The organizing half of every address. A `spellframe` is the **category** half of the Address Law. It can be a plain string when you just want grouping, or a `Protocol` when you want a *shape*: ```python # strings — organize by role book.bind(spell=UsersRepo, existence="unique", spellframe="storage", binding_name="users") book.bind(spell=UsersApi, existence="unique", spellframe="web", binding_name="users") repo = conduit.meld(spellframe="storage", binding_name="users") api = conduit.meld(spellframe="web", binding_name="users") ``` Same `binding_name`, two categories, **two distinct addresses** — names never collide across spellframes. And because a `Protocol` works as a spellframe, one category can mean "everything that satisfies this shape," which is exactly what collection DI resolves: ```python book.bind(spell=EmailHandler, existence="unique", spellframe=Handler, binding_name="email") ``` ## Runnable examples - [Spellframe grouping](../examples/beginner/09-spellframe-grouping.md) — Beginner 09 - [Protocols as shapes](../examples/beginner/17-protocols-as-shapes.md) — Beginner 17 - [Frames as dict classification](../examples/beginner/25-frames-as-dict-classification.md) — Beginner 25 - [Meld a frame as dict](../examples/beginner/38-meld-a-frame-as-dict.md) — Beginner 38 [All beginner examples](../examples/beginner/index.md) · [Level contents](index.md) · [Full contents](../contents.md) [Canonical page source](https://github.com/Synaptic724/melder/blob/a30a754d0bb61db0b142936010cdb82cffecec6f/README.md)