2009-11-05 6 views
10

Sie wissen, wie Moose während des Imports automatisch strict und warnings einschaltet? Ich möchte dieses Verhalten erweitern, indem ich autodie und use feature ':5.10' in meinen Moose-Klassen einschalte.Wie kann ich die automatischen Pragma-Exporte von Moose verlängern?

Ich habe aufgespürt, wo Moose dies der Fall ist, in Moose::Exporter, die eine benutzerdefinierte import Unter für Moose versammelt, die strict->import und warnings->import für den anrufenden Klasse aufruft.

Allerdings kann ich keinen Weg finden, diese Importmethode auf eine moose Art zu erweitern.

Wie soll ich damit umgehen?

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

Antwort

2

Da es viele Möglichkeiten gibt, wie ein Modul seine Funktionen in den Namespace use -ing exportieren kann, müssen Sie möglicherweise Code-Grabung durchführen, um jede gewünschte Bibliothek zu implementieren. Was Sie fragen, ist nichts, was für Moose spezifisch ist. Sie können also Ihr eigenes Best Practices-Modul schreiben, das eine Gruppe von Standards für Sie erstellt, z.

use OurCompany::BestPractices::V1; 

mit

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 macht die Dinge ein wenig komplizierter, da es auf der Suche nach dem Paket der Verwendung-er verlässt sich vom Anrufer() und verwendet die goto, aber Sie können eine bessere Lage zu finden, Weg mit mehr Tests. Je mehr Sie implementieren, desto komplizierter kann diese Bibliothek sein, aber sie ist möglicherweise von ausreichendem Wert, um die einmalige Lösung zu haben, die Sie in Ihrem gesamten oder Ihrem Unternehmenscode verwenden können.

+0

Tolles Beispiel, danke – friedo

+0

Ich endete mit einer Variation dieser Idee. – friedo

1

Sie haben eine Unter Import genannt in Ihrem Paket zu definieren, und importieren Sie alle anderen Sachen gibt.

Ein Beispiel aus Moderne :: Perl (eine andere Policy-Modul Sie betrachten könnte):

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'); 
} 

Update: Leider hat sorgfältig genug, um die Frage nicht lesen.

Eine gute Möglichkeit, eine vorhandene Importmethode zu erweitern, besteht darin, eigene Dateien in ein neues Paket zu schreiben und von dort die Importmethode von Moose aufzurufen. Sie können das durch Unterklassen machen, vielleicht können Sie sogar selbst Elche dafür benutzen ;-)

5

Mein Ansatz löst das Problem rückwärts.

Warum nicht ToolSet verwenden, um eine Gruppe von use Anweisungen zu erstellen, die Moose enthält, zusammen mit Ihren zusätzlichen Pragmas?

Der Code sollte etwas wie folgt aussehen:

# 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 

ich nicht getestet haben. Ehrlich gesagt, ich habe gerade vor ein paar Tagen ToolSet gefunden und hatte noch keine Gelegenheit, es noch einmal auszuprobieren. FWIW, die Bewertungen sind positiv.

+0

Danke für die Anregung Mit Blick auf die Dokumentation für Moose::Exporter folgendes grob sein sollte, was Sie für

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; } 

sind gefragt. Ich hatte noch nichts von ToolSet gehört; Ich untersuche es jetzt. – friedo

2

Moose::Exporter können Sie eine benutzerdefinierte import Methode für eine Zuckerklasse definieren, die Sie verwenden. MooseX::POE verwendet eine Version von diesem seit Jahren, tut es aber in was ich eine "hackish" Mode.Dies kann dann verwendet werden, wie so

package MyApp; 
use Modern::Moose; 

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

Danke! Ich werde das später noch einmal versuchen und sehen, ob ich es verstehen kann. – friedo

Verwandte Themen