Digamos que uso cierto conjunto de repeticiones con bastante frecuencia:
class Foo {
method abc($a: $b, $c, +@d) is pure {
use Slang::Bar;
…
}
method xyz($a: $b, $c, +@d) is pure {
use Slang::Bar;
…
}
method blarg($a: $b, $c, +@d) is pure {
use Slang::Bar;
…
}
}
Prefiero poder decir:
class Foo is/does Bar {
bar abc { … }
bar xyz { … }
bar blarg { … }
}
Y en algún lugar de Bar, configure la declaración para bar (o, dado que la clase Foo finalmente usará su propio declarador, podría ir a otro lugar y no tiene que extraerse en un Tipo separado). ¿Cómo voy a hacer eso?
Respuestas:
-1. Limitaciones (solo para paquetes)
El método EXPORTHOW llama a .set_how en current
$?LANG
agregando un argot a este último.Luego agrega el paquete_declarador al
MAIN
$?LANG
que agrega unpackage_declarator
método a sus acciones y gramática. Es, creo, la única "jerga dinámica" (en World.nqp).Si lo que desea es sobrescribir rutina_declarador . Luego tienes que escribir una jerga que imite la cadena que acabamos de citar. Si acepta mantener la palabra clave del método y hacer la firma automática en la clase, digamos de acuerdo con el nombre del método, esta es una manera:
Nota: Un paquete es un contenedor (paquete, gramática, módulo, rol, knowhow, enumeración, clase, subconjunto). Si pones código dentro como un método, esto se ejecuta (lo acabo de probar):
0. Descripción (EXPORTHOW)
Usaría EXPORTHOW indocumentado y
DECLARE
en un módulo porque no encontré una manera con Phaser . Aparentemente es demasiado tarde incluso en BEGIN.El ejemplo que doy es decorar cada método en una clase (incluso
BUILDALL
).1. Lib (
decorator.rakumod
)2. Ejecutable
3. Salida
4. Fuentes
for $_.HOW.method_table($_)
creación de un nuevo hash sobrescribiendo el caché del método con el (bien nombrado)nqp::setmethcache
.fuente