{"id":"elwapotedev/clases","name":"clases","scope":"elwapotedev","platform":"roblox","description":"SOTA class library for Luau and Roblox: fast direct-index classes, inheritance, super, lifecycle cleanup, strict tests, and Rojo packaging.","version":"0.2.1","latest":"0.2.1","versions":["0.2.1"],"license":"MIT","licenseRating":"safe","licenseCaveats":[],"licenseVerified":true,"dependencies":{},"integrity":"a8ea3425c9ee740de723bad1023f8b0a5645d4660d3333f944dc2cacc0dbb259","likes":0,"downloads":0,"install":"forest install elwapotedev/clases","url":"https://forest.dev/p/roblox/elwapotedev/clases","files":"https://api.forest.dev/ai/package/roblox/elwapotedev/clases/files","readme":"# Clases\n\n[![CI](https://github.com/ElWapoteDev/Clases/actions/workflows/ci.yml/badge.svg)](https://github.com/ElWapoteDev/Clases/actions/workflows/ci.yml)\n[![Docs](https://github.com/ElWapoteDev/Clases/actions/workflows/pages.yml/badge.svg)](https://github.com/ElWapoteDev/Clases/actions/workflows/pages.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n![Luau strict](https://img.shields.io/badge/Luau-%2D%2D!strict-1a8f52)\n\nClases es una libreria pequena y estricta para crear clases en Luau/Roblox con lifecycle real: herencia, `super`, `Destroy`, cleanup LIFO, mixins, introspeccion y tipado practico.\n\nNo intenta convertir Luau en Java. Toma el patron normal de metatables y lo vuelve consistente para proyectos grandes.\n\nPagina de documentacion: <https://elwapotedev.github.io/Clases/>.\n\n## Por que existe\n\nUna clase normal de Roblox suele empezar asi:\n\n```luau\nlocal Class = {}\nClass.__index = Class\n```\n\nEso esta bien para objetos pequenos, pero no te da:\n\n- Orden automatico de constructores y destructores.\n- `Destroy` consistente e idempotente.\n- Cleanup automatico de conexiones, instancias, callbacks, threads y promesas.\n- Helpers de lifecycle: `connect`, `bindToInstance` (auto-`Destroy`) y cleanup con llave.\n- `super`.\n- `IsA` con herencia real.\n- Proteccion contra nombres reservados.\n- Mixins con deteccion de conflictos.\n- Clases abstractas.\n- Tipado del constructor con `Clases.Class<T, A...>`.\n- Tooling headless, tests, benchmarks, packaging y CI.\n\nClases cubre ese espacio sin meter un framework gigante.\n\n## Instalacion rapida\n\nCon Wally:\n\n```toml\n[dependencies]\nClases = \"elwapotedev/clases@0.2.1\"\n```\n\nComo modelo Rojo:\n\n```bash\nrojo build default.project.json -o build/Clases.rbxm\n```\n\nComo modulo en un juego:\n\n```luau\nlocal ReplicatedStorage = game:GetService(\"ReplicatedStorage\")\nlocal Clases = require(ReplicatedStorage.Shared.Clases)\n```\n\nLee la guia completa: [docs/INSTALLATION.md](docs/INSTALLATION.md).\n\n## Ejemplo tipado\n\n```luau\nlocal Clases = require(game.ReplicatedStorage.Shared.Clases)\n\nexport type Counter = Clases.Object & {\n\tvalue: number,\n\tadd: (self: Counter, amount: number) -> number,\n}\n\n-- El pack de argumentos `(number)` tipa `Counter.new(...)` y `Counter(...)`.\nexport type CounterClass = Clases.Class<Counter, (number)>\n\nlocal Counter: CounterClass = Clases.define(\"Counter\", {\n\tconstructor = function(self: Counter, value: number)\n\t\tself.value = value\n\tend,\n\n\tmethods = {\n\t\tadd = function(self: Counter, amount: number): number\n\t\t\tself.value += amount\n\t\t\treturn self.value\n\t\tend,\n\t},\n})\n\nlocal counter = Counter.new(10)\ncounter:add(5)\ncounter:Destroy()\n```\n\nGuia completa de tipado: [docs/TYPING.md](docs/TYPING.md).\n\n## Con conexiones de Roblox\n\n```luau\nlocal ButtonController = Clases.define(\"ButtonController\", {\n\tconstructor = function(self, button: TextButton)\n\t\t-- connect registra y desconecta la conexion al destruir.\n\t\tself:connect(button.MouseButton1Click, function()\n\t\t\tself:onClicked()\n\t\tend)\n\n\t\t-- bindToInstance destruye el controller cuando el boton deja de existir.\n\t\tself:bindToInstance(button)\n\tend,\n\n\tmethods = {\n\t\tonClicked = function(self)\n\t\t\tprint(\"click\")\n\t\tend,\n\t},\n})\n\nlocal controller = ButtonController.new(button)\ncontroller:Destroy() -- desconecta MouseButton1Click\n```\n\n## Documentacion\n\n- [Instalacion](docs/INSTALLATION.md)\n- [Tipado estricto](docs/TYPING.md)\n- [API completa](docs/API.md)\n- [Lifecycle y cleanup](docs/LIFECYCLE.md)\n- [Herencia y mixins](docs/MIXINS.md)\n- [Uso en Roblox](docs/ROBLOX.md)\n- [Migracion desde clases manuales](docs/MIGRATION.md)\n- [Diseno interno](docs/DESIGN.md)\n- [Publicacion](docs/PUBLISHING.md)\n- [FAQ](docs/FAQ.md)\n\nLa pagina web estatica vive en [docs/index.html](docs/index.html).\n\n## API minima\n\n```luau\nlocal Class = Clases.define(name, definition)\nlocal Child = Class:extend(name, definition)\nlocal object = Class.new(...)\nlocal object = Class(...)\n```\n\nInstancias:\n\n- `object:IsA(Class)` / `object:is(Class)`\n- `object:assert(Class)` — refina al tipo de la clase\n- `object:super(\"methodName\", ...)`\n- `object:addCleanup(task, methodName?, key?)`\n- `object:getCleanup(key)`\n- `object:removeCleanup(task, shouldClean?)`\n- `object:connect(signal, callback)`\n- `object:bindToInstance(instance)`\n- `object:addPromise(promise)`\n- `object:cleanup()`\n- `object:Destroy()` / `object:destroy()`\n- `object:isDestroyed()`\n- `object:getClass()`\n- `object:getClassName()`\n\n## Calidad\n\n```bash\naftman install\nlune run check\n```\n\n`check` ejecuta:\n\n- StyLua\n- Selene\n- `luau-lsp analyze`\n- Tests headless con Lune\n- Sourcemap determinista\n- Validacion de paquete Wally\n\nComandos puntuales:\n\n```bash\nlune run test\nlune run bench\nlune run sourcemap\nwally package --list --output build/clases.tar.gz\n```\n\n## Rojo\n\nEl proyecto principal genera un `ModuleScript` raiz llamado `Clases`:\n\n```bash\nrojo build default.project.json -o build/Clases.rbxm\n```\n\nPara desarrollo en Studio:\n\n```bash\nrojo serve dev.project.json\n```\n\n## Wally\n\nPublicado en Wally como [`elwapotedev/clases`](https://wally.run/package/elwapotedev/clases):\n\n```toml\n[dependencies]\nClases = \"elwapotedev/clases@0.2.1\"\n```\n\nLuego corre `wally install`. El manifiesto de [pesde](pesde.toml) queda privado hasta publicar ahi.\n\n## Fuentes de diseno\n\nEl diseno se apoya en la documentacion oficial de Luau sobre OOP, rendimiento de metatables, `table.freeze`, require-by-string y sourcemaps de Rojo. Ver [docs/DESIGN.md](docs/DESIGN.md).\n","readmeTruncated":false}