2013-08-14 9 views
5

La mia prima domanda su questo sito, vengo rapidamente. Sono uno sviluppatore, utilizzo principalmente Python e Perl. Sono appassionato e mi piace molto lo sviluppo.Come utilizzare i tipi :: Path :: Tiny with Moo

La mia prima domanda riguarda Perl, Moo e Type :: Tiny. Type :: Tiny è un ottimo modulo da utilizzare con Moo, ovviamente, ma tornerò su questo argomento in un'altra domanda.

ho scoperto Tipi :: Path :: Minuscoli un modulo coercizioni per Moose e Moo, così ho provato a fare una directory attributo nella mia classe come come descritto nel documentation, come il mio progetto era in Moose esso opera, ma dal momento che mi sono trasferito in Moo, non funziona più:

package MahewinBlogEngine::Common; 

use strict; 
use warnings; 

use feature "state"; 

use Moo; 
use Types::Path::Tiny qw/Path AbsPath/; 

use CHI; 
use MahewinBlogEngine::Renderer; 

use Type::Params qw(compile); 
use Types::Standard qw(slurpy Object Str HashRef ArrayRef); 


=attr directory 

rw, required, Str. The directory contain articles. 

=cut 

has 'directory' => (
    is  => 'rw', 
    isa  => AbsPath, 
    required => 1, 
    coerce => 1, 
); 

nel mio prove:

my $articles = MahewinBlogEngine->articles(directory => getcwd() . '/t/articles'); 

errore è:

Invalid coerce '1' for MahewinBlogEngine::Common->directory not a coderef or code-convertible object at /home/hobbestigrou/perl5/perlbrew/perls/perl-5.19.1/lib/site_perl/5.19.1/Method/Generate/Accessor.pm line 618. 
Compilation failed in require at /home/hobbestigrou/perl5/perlbrew/perls/perl-5.19.1/lib/site_perl/5.19.1/Module/Runtime.pm line 317. 
Compilation failed in require at /home/hobbestigrou/MahewinBlogEngine/lib/MahewinBlogEngine.pm line 8. 
BEGIN failed--compilation aborted at /home/hobbestigrou/MahewinBlogEngine/lib/MahewinBlogEngine.pm line 8. 
Compilation failed in require at ./benchmark.pl line 10. 
BEGIN failed--compilation aborted at ./benchmark.pl line 10. 

Questo è normale, perché con Moo la coercizione è un rifcodice così ho provato:

has 'directory' => (
    is  => 'rw', 
    isa  => AbsPath, 
    required => 1, 
    coerce => sub { return "Path" } 
); 

errore è:

value "Path" did not pass type constraint "Path" (not isa Path::Tiny) (in $self->{"directory"}) at (eval 355) line 99. 

Se non ho coerce:

value "/home/hobbestigrou/MahewinBlogEngine/t/articles" did not pass type constraint "Path" (not isa Path::Tiny) (in $self->{"directory"}) at (eval 355) line 89. 

I' Mi dispiace per questa semplice domanda, devo essere stupida e perdere qualcosa, ma non vedo cosa mi sia sfuggito qualcosa nel doc.

Grazie

+1

Condivide la directory bisogno di essere un 'Percorso :: oggetto Tiny'? ... 'coerce => sub {return Path :: Tiny-> new ($ _ [0])}'? – mob

+0

Grazie funziona alla grande. – Hobbestigrou

risposta

6

Non v'è alcun motivo per avere use strict; e use warnings; se avete use Moo; come fa per voi.

È inoltre necessario fornire Moo un riferimento di codice per l'elemento coerce, non un valore vero.
Il modo in cui lo si ottiene con Type::Tiny è chiamando $type->coercion.

package MahewinBlogEngine::Common; 

# not needed with Moo 
# use strict; 
# use warnings; 

use Moo; 
use Types::Path::Tiny qw/AbsPath/; 

... 

has 'directory' => (
    is  => 'rw', 
    isa  => AbsPath, 
    required => 1, 
    coerce => AbsPath->coercion, 
); 
for(qw'/home ./ ./Documents Documents'){ 
    use feature 'say'; 
    say $_, "\t", MahewinBlogEngine::Common->new(directory => $_)->directory; 
} 
/home /home 
./  /home/user 
./Documents  /home/user/Documents 
Documents  /home/user/Documents 
+1

Ciao, hai ragione, non c'è bisogno di usare pragma severo e avvertimenti con Moo, grazie è bello. – Hobbestigrou

+0

Tuttavia, potresti voler usare il modulo [strictures] (https://metacpan.org/pod/strictures). Da [Moo] (https://metacpan.org/pod/Moo#INCOMPATIBILITIES-WITH-MOOSE) POD: _ "Gestione degli avvisi: quando usi Moo abilitiamo severi e avvisi, in modo simile a Moose Gli autori raccomandano l'uso di 'strictures', che abilita gli avvertimenti FATAL, e diversi pragma extra quando usati nello sviluppo: [indiretto] (https://metacpan.org/pod/indirect), [multidimensionale] (https: // metacpan.org/pod/multidimensional) e [bareword :: filehandles] (https://metacpan.org/pod/bareword::filehandles). "_ –

+0

@JayAllen Moo utilizzato per abilitare le stenografie, ma si è scoperto che troppo problematico per i moduli CPAN se ci sono stati avvisi aggiunti a perl. –

Problemi correlati