work in progress for arrayref coercions
Karen Etheridge [Fri, 12 Oct 2012 22:32:42 +0000 (15:32 -0700)]
lib/MooseX/Types/Path/Class.pm
t/01.basic.t

index d4e86d0..b8f75b3 100644 (file)
@@ -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
index fa0b1a7..0295671 100644 (file)
@@ -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);
+}
+