2009-11-05 8 views
10

¿Sabe cómo Moose enciende automáticamente strict y warnings durante la importación? Quiero extender ese comportamiento activando autodie y use feature ':5.10' en mis clases de Moose.¿Cómo puedo extender las exportaciones automáticas de pragma de Moose?

He rastreado hacia abajo, donde Moose hace esto, en Moose::Exporter, que ensambla una costumbre import sub Moose para que llama strict->import y warnings->import para la clase de llamadas.

Sin embargo, no puedo encontrar la manera de extender este método de importación de una manera al estilo Moose-ish.

¿Cómo debo manejar esto?

http://www.friedo.com/bullwinkle.gif

Respuesta

2

Dado que hay muchas maneras en que un módulo puede exportar sus funciones al espacio de nombres use -ing, es posible que necesite realizar una búsqueda de código para implementar cada biblioteca deseada. Lo que está solicitando no es algo específico de Moose, por lo que puede escribir su propio módulo de prácticas recomendadas o el de su empresa, que establecerá un grupo de normas para que trabaje, p.

use OurCompany::BestPractices::V1; 

con

package OurCompany::BestPractices::V1; 

use strict; 
use warnings; 
use feature (':5.10'); 
require Fatal; 
require Moose; 

# Required for straight implementation of autodie code 
our @ISA; 
push @ISA, qw(
    Fatal 
); 

sub import { 
    my $caller = caller; 
    strict->import; 
    warnings->import; 
    feature->import(':5.10'); 
    Moose->import ({into => $caller}); 

    #autodie implementation copied from autodie source 
    splice(@_,1,0,Fatal::LEXICAL_TAG); 
    goto &Fatal::import; 
} 

1; 

Autodie hace las cosas un poco más complicado ya que se basa en la búsqueda de paquete del uso-er del llamante() y utiliza el Goto, pero usted puede ser capaz de encontrar una mejor camino con más pruebas. Cuanto más implemente, más complicada puede ser esta biblioteca, pero puede ser lo suficientemente valiosa como para que tenga la solución única que puede usar dentro de su código o el de su compañía.

+0

Gran ejemplo, gracias – friedo

+0

Terminé usando una variación de esta idea. – friedo

1

tiene que definir un sub llamada de importación en su conjunto, e importar todas las otras cosas allí.

Un ejemplo de Perl :: Moderno (otro módulo de política lo podría hacer en):

use 5.010_000; 

use strict; 
use warnings; 

use mro (); 
use feature(); 

sub import { 
    warnings->import(); 
    strict->import(); 
    feature->import(':5.10'); 
    mro::set_mro(scalar caller(), 'c3'); 
} 

Actualización: Lo sentimos, no leyó la pregunta con suficiente cuidado.

Una buena forma de extender un método de importación existente es escribir el suyo propio en un paquete nuevo y llamar al método de importación de Moose desde allí. Puedes hacerlo subclasificando, quizás incluso puedas usar Moose para eso ;-)

5

Mi enfoque resuelve el problema al revés.

¿Por qué no utilizar ToolSet para crear un grupo de use declaraciones que incluye Moose, junto con sus pragmas adicionales?

El código debe ser algo como:

# MagicMoose.pm 
package MagicMoose; 

use base 'ToolSet'; 

ToolSet->use_pragma(qw/feature :5.10/); # perl 5.10 
ToolSet->use_pragma(qw/autodie/); 

# define exports from other modules 
ToolSet->export(
    'Moose'   => undef,  # get the defaults 
); 

1; # modules must return true 

No he probado esto. Francamente, acabo de encontrar ToolSet hace unos días, y aún no he tenido la oportunidad de probarlo. FWIW, las críticas son positivas.

+0

Gracias por la sugerencia. No había oído hablar de ToolSet; Lo estoy investigando ahora. – friedo

2

Moose::Exporter le permitirá definir un método personalizado import para una clase de azúcar que esté utilizando. MooseX::POE usó una versión de esto durante años, pero lo hace en lo que considero una moda "hackosa".En cuanto a la documentación de Moose::Exporter la siguiente debería ser más o menos lo que estás pidiendo

package Modern::Moose; 
use Moose(); 
use Moose::Exporter; 

my ($import) = Moose::Exporter->build_import_methods(
    also => 'Moose', 
    install => [qw(unimport init_meta)], 
); 

sub import { # borrowing from mortiz's answer for feature/mro 
    feature->import(':5.10'); 
    mro::set_mro(scalar caller(), 'c3');   
    goto &$import; 
} 

Esto entonces se puede utilizar como así

package MyApp; 
use Modern::Moose; 

has greeting => (is => 'ro', default => 'Hello'); 
sub run { say $_[0]->greeting } # 5.10 is enabled 
+0

¡Gracias! Le daré una oportunidad más tarde y veré si puedo darle sentido. – friedo

Cuestiones relacionadas