如何使用Types :: Path :: Tiny with Moo

时间:2013-08-14 22:21:12

标签: perl types moose coerce moo

我在这个网站上的第一个问题,我来得很快。我是开发人员,我主要使用Python和Perl。我很有激情,我非常喜欢这个发展。

我的第一个问题是关于Perl,Moo和Type :: Tiny。 Type :: Tiny当然是与Moo一起使用的一个很棒的模块,但我会在另一个问题上回到这个主题。

我发现了Types :: Path :: Tiny Moose和Moo的模块强制,所以我尝试在我的类中创建一个属性目录,如documentation中描述的那样,因为我的项目是在Moose中工作的,但自从我搬进Moo后,它就不再适用了:

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,
);

在我的测试目录中:

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

错误是:

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.

这是正常的,因为对于Moo,强制是一个coderef所以我试过:

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

错误是:

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

如果我没有强迫:

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

我很抱歉这个简单的问题,我一定是傻了,想念一些东西,但我看不出我在文档中遗漏了什么。

由于

1 个答案:

答案 0 :(得分:6)

如果您拥有use strict;,则没有理由拥有use warnings;use Moo;

您还必须为coerce元素提供Moo代码参考,而不是真正的值。
您使用Type::Tiny获得该方法的方法是致电$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