some cleanup
[gitmo/MooseX-Types-Path-Class.git] / lib / MooseX / Types / Path / Class.pm
1 package MooseX::Types::Path::Class;
2
3 use warnings FATAL => 'all';
4 use strict;
5
6 our $VERSION = '0.05';
7 our $AUTHORITY = 'cpan:THEPLER';
8
9 use Path::Class ();
10 # TODO: export dir() and file() from Path::Class? (maybe)
11
12 use MooseX::Types
13     -declare => [qw( Dir File )];
14
15 use MooseX::Types::Moose qw(Str ArrayRef);
16
17 class_type('Path::Class::Dir');
18 class_type('Path::Class::File');
19
20 subtype Dir, as 'Path::Class::Dir';
21 subtype File, as 'Path::Class::File';
22
23 for my $type ( 'Path::Class::Dir', Dir ) {
24     coerce $type,
25         from Str,      via { Path::Class::Dir->new($_) },
26         from ArrayRef, via { Path::Class::Dir->new(@$_) };
27 }
28
29 for my $type ( 'Path::Class::File', File ) {
30     coerce $type,
31         from Str,      via { Path::Class::File->new($_) },
32         from ArrayRef, via { Path::Class::File->new(@$_) };
33 }
34
35 # optionally add Getopt option type
36 eval { require MooseX::Getopt; };
37 if ( !$@ ) {
38     MooseX::Getopt::OptionTypeMap->add_option_type_to_map( $_, '=s', )
39         for ( 'Path::Class::Dir', 'Path::Class::File', Dir, File, );
40 }
41
42 1;
43 __END__
44
45
46 =head1 NAME
47
48 MooseX::Types::Path::Class - A Path::Class type library for Moose
49
50
51 =head1 SYNOPSIS
52
53   package MyClass;
54   use Moose;
55   use MooseX::Types::Path::Class;
56   with 'MooseX::Getopt';  # optional
57
58   has 'dir' => (
59       is       => 'ro',
60       isa      => 'Path::Class::Dir',
61       required => 1,
62       coerce   => 1,
63   );
64
65   has 'file' => (
66       is       => 'ro',
67       isa      => 'Path::Class::File',
68       required => 1,
69       coerce   => 1,
70   );
71
72   # these attributes are coerced to the
73   # appropriate Path::Class objects
74   MyClass->new( dir => '/some/directory/', file => '/some/file' );
75
76   
77 =head1 DESCRIPTION
78
79 MooseX::Types::Path::Class creates common L<Moose> types,
80 coercions and option specifications useful for dealing
81 with L<Path::Class> objects as L<Moose> attributes.
82
83 Coercions (see L<Moose::Util::TypeConstraints>) are made
84 from both 'Str' and 'ArrayRef' to both L<Path::Class::Dir> and
85 L<Path::Class::File> objects.  If you have L<MooseX::Getopt> installed,
86 the Getopt option type ("=s") will be added for both
87 L<Path::Class::Dir> and L<Path::Class::File>.
88
89
90 =head1 EXPORTS
91
92 None of these are exported by default.  They are provided via
93 L<MooseX::Types>.
94
95 =over
96
97 =item Dir, File
98
99 These exports can be used instead of the full class names.  Example:
100
101   package MyClass;
102   use Moose;
103   use MooseX::Types::Path::Class qw(Dir File);
104
105   has 'dir' => (
106       is       => 'ro',
107       isa      => Dir,
108       required => 1,
109       coerce   => 1,
110   );
111
112   has 'file' => (
113       is       => 'ro',
114       isa      => File,
115       required => 1,
116       coerce   => 1,
117   );
118
119 Note that there are no quotes around Dir or File.
120
121 =item is_Dir($value), is_File($value)
122
123 Returns true or false based on whether $value is a valid Dir or File.
124
125 =item to_Dir($value), to_File($value)
126
127 Attempts to coerce $value to a Dir or File.  Returns the coerced value
128 or false if the coercion failed.
129
130 =back
131
132
133 =head1 DEPENDENCIES
134
135 L<Moose>, L<MooseX::Types>, L<Path::Class>
136
137
138 =head1 BUGS AND LIMITATIONS
139
140 If you find a bug please either email the author, or add
141 the bug to cpan-RT L<http://rt.cpan.org>.
142
143
144 =head1 AUTHOR
145
146 Todd Hepler  C<< <thepler@employees.org> >>
147
148
149 =head1 LICENCE AND COPYRIGHT
150
151 Copyright (c) 2007-2008, Todd Hepler C<< <thepler@employees.org> >>.
152
153 This module is free software; you can redistribute it and/or
154 modify it under the same terms as Perl itself. See L<perlartistic>.
155
156