From: Karen Etheridge Date: Fri, 12 Oct 2012 22:32:42 +0000 (-0700) Subject: work in progress for arrayref coercions X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=610dc043bddbcdef6cb4381214a68c292ff7c483;p=gitmo%2FMooseX-Types-Path-Class.git work in progress for arrayref coercions --- diff --git a/lib/MooseX/Types/Path/Class.pm b/lib/MooseX/Types/Path/Class.pm index d4e86d0..b8f75b3 100644 --- a/lib/MooseX/Types/Path/Class.pm +++ b/lib/MooseX/Types/Path/Class.pm @@ -20,12 +20,20 @@ for my $type ( 'Path::Class::Dir', Dir ) { coerce $type, from Str, via { Path::Class::Dir->new($_) }, from ArrayRef, via { Path::Class::Dir->new(@$_) }; + + coerce ArrayRef[$type], + from ArrayRef[Str], via { [ map { Path::Class::Dir->new($_) } @$_ ] }, + from ArrayRef[ArrayRef], via { [ map { Path::Class::Dir->new(@$_) } @$_ ] }; } for my $type ( 'Path::Class::File', File ) { coerce $type, from Str, via { Path::Class::File->new($_) }, from ArrayRef, via { Path::Class::File->new(@$_) }; + + coerce ArrayRef[$type], + from ArrayRef[Str], via { [ map { Path::Class::File->new($_) } @$_ ] }, + from ArrayRef[ArrayRef], via { [ map { Path::Class::File->new(@$_) } @$_ ] }; } # optionally add Getopt option type diff --git a/t/01.basic.t b/t/01.basic.t index fa0b1a7..0295671 100644 --- a/t/01.basic.t +++ b/t/01.basic.t @@ -11,14 +11,24 @@ use strict; has 'dir' => ( is => 'ro', isa => 'Path::Class::Dir', - required => 1, coerce => 1, ); has 'file' => ( is => 'ro', isa => 'Path::Class::File', - required => 1, + coerce => 1, + ); + + has 'dirs' => ( + is => 'ro', + isa => 'ArrayRef[Path::Class::Dir]', + coerce => 1, + ); + + has 'files' => ( + is => 'ro', + isa => 'ArrayRef[Path::Class::File]', coerce => 1, ); } @@ -28,18 +38,29 @@ use strict; package Bar; use Moose; use MooseX::Types::Path::Class qw( Dir File ); + use MooseX::Types::Moose qw(ArrayRef); has 'dir' => ( is => 'ro', isa => Dir, - required => 1, coerce => 1, ); has 'file' => ( is => 'ro', isa => File, - required => 1, + coerce => 1, + ); + + has 'dirs' => ( + is => 'ro', + isa => ArrayRef[Dir], + coerce => 1, + ); + + has 'files' => ( + is => 'ro', + isa => ArrayRef[File], coerce => 1, ); } @@ -67,3 +88,38 @@ for my $class (qw(Foo Bar)) { $check->($o); } + + +my @dirs = (dir('', 'tmp'), dir('', 'etc')); +my @files = (dir('', 'tmp', 'foo'), dir('', 'etc', 'foo')); + +my $check_arrays = sub { + my $o = shift; + + is(scalar($o->dirs), 2, '2 dirs'); + isa_ok( $_, 'Path::Class::Dir') foreach $o->dirs; + cmp_ok( ($o->dirs)->[$_], 'eq', "$dirs[$_]", "dir is $dir" ) foreach (0 .. @dirs); + +# is(scalar($o->files), 2, '2 files'); +# isa_ok( $_, 'Path::Class::File' ) foreach $o->files; +# +# cmp_ok( ($o->files)->[$_], 'eq', "$files[$_]", "file is $files[$_]" ) foreach (0.. @files); +}; + +for my $class (qw(Foo Bar)) { + +my %args = ( +dirs => [ map { "$_" } @dirs ], +file => [ map { [ split('/', $_->stringify) ] } @files ], +); +use Data::Dumper; +print "### constructing $class with args: ", Dumper(\%args); + + my $o = $class->new( + dirs => [ map { "$_" } @dirs ], +# file => [ map { [ split('/', $_->stringify) ] } @files ], + ); + isa_ok( $o, $class ); + $check_arrays->($o); +} +