perlmroapi - Interfaz del complemento de resolución de métodos de Perl
En Perl 5.10.1 se incluyó una nueva interfaz para conectar y usar órdenes de resolución de métodos distintos del predeterminado (búsqueda lineal en profundidad). El orden de resolución de métodos C3 agregado en 5.10.0 se ha reimplementado como un complemento sin cambiar su interfaz del espacio Perl.
Cada complemento debe registrarse a sí mismo proporcionando la siguiente estructura
struct mro_alg { AV *(*resolve)(pTHX_ HV *stash, U32 level); const char *name; U16 length; U16 kflags; U32 hash; };
y llamar a Perl_mro_register:
Perl_mro_register
Perl_mro_register(aTHX_ &mi_alg_mro);
Puntero a la función de linealización, que se describe a continuación.
Nombre del orden de resolución de métodos, codificado en ISO-8859-1 o UTF-8.
Longitud del nombre.
Si se proporciona el nombre codificado en UTF-8, debe establecer HVhek_UTF8 como valor de kflags. El valor se pasa directamente como el parámetro kflags a hv_common().
HVhek_UTF8
hv_common()
Un valor de hash calculado previamente para el nombre del orden de resolución de métodos, o bien 0.
La función resolve se llama para generar una relación ISA lineal para el hash de tabla de símbolos (o "stash", contracción de symbol table hash) indicado, con este orden de resolución de métodos. Se llama con un puntero al hash de tabla de símbolos, y un valor de level igual a 0. El núcleo siempre establece level en 0 cuando se llama a la función; el parámetro se proporciona para permitir que su implementación pueda realizar un seguimiento de la profundidad en caso de que tenga que funcionar de manera recursiva.
resolve
La función debe devolver una referencia a un array con las clases primarias ordenadas. Los nombres de las clases deben ser el resultado de llamar a HvENAME() en el hash de tabla de símbolos. En aquellos casos en los que HvENAME() devuelva un valor nulo, se debe usar HvNAME() en su lugar.
HvENAME()
HvNAME()
El código que llama debe encargarse de incrementar el contador de referencias del array devuelto si se quiere mantener la estructura. Por lo tanto, si ha creado un valor temporal al que no apunta ningún puntero, use sv_2mortal() para asegurarse de que se elimina de la manera correcta. Si almacenó en caché el valor devuelto, debe devolver un puntero a dicho valor sin cambiar el contador de referencias.
sv_2mortal()
El cálculo de órdenes de resolución de métodos puede ser costoso. La implementación proporciona una caché en la que puede almacenar un único SV *, o cualquier cosa que se pueda convertir en SV *, como un AV *. Para leer el valor privado, use la macro MRO_GET_PRIVATE_DATA(), pasándole la estructura mro_meta del hash de tabla de símbolos, y un puntero a la estructura mro_alg:
SV *
AV *
MRO_GET_PRIVATE_DATA()
mro_meta
mro_alg
meta = HvMROMETA(stash); private_sv = MRO_GET_PRIVATE_DATA(meta, &mi_alg_mro);
Para establecer el valor privado, llame a Perl_mro_set_private_data():
Perl_mro_set_private_data()
Perl_mro_set_private_data(aTHX_ meta, &alg_c3, private_sv);
La caché de datos privada se apropiará de una referencia a private_sv, de la misma manera que hv_store() asumirá la propiedad de una referencia al valor que le pase.
hv_store()
Si desea ver ejemplos de implementaciones de orden de resolución de métodos, consulte S_mro_get_linear_isa_c3() y la sección BOOT: de ext/mro/mro.xs; vea también S_mro_get_linear_isa_dfs() en mro_core.c
S_mro_get_linear_isa_c3()
BOOT:
S_mro_get_linear_isa_dfs()
La aplicación del orden de resolución de métodos C3 y los órdenes de resolución de métodos intercambiables del núcleo de Perl son obra de Brandon L. Black. Nicholas Clark creó la interfaz conectable, refactorizó la implementación de Brandon para trabajar con ella y redactó este documento.
Joaquín Ferrero (Tech Lead)
Enrique Nell (Language Lead)
To install POD2::ES, copy and paste the appropriate command in to your terminal.
cpanm
cpanm POD2::ES
CPAN shell
perl -MCPAN -e shell install POD2::ES
For more information on module installation, please visit the detailed CPAN module installation guide.