Commit | Line | Data |
4664d531 |
1 | #!/usr/bin/perl |
2 | |
3 | package MooseX::Types::DateTime; |
4 | |
5 | use strict; |
6 | use warnings; |
7 | |
fddffe15 |
8 | our $VERSION = "0.07"; |
4664d531 |
9 | |
2820aea9 |
10 | use Moose 0.41 (); |
11 | use DateTime 0.4302 (); |
12 | use DateTime::Duration 0.4302 (); |
13 | use DateTime::Locale 0.4001 (); |
14 | use DateTime::TimeZone 0.95 (); |
4664d531 |
15 | |
2820aea9 |
16 | use MooseX::Types::Moose 0.30 qw/Num HashRef Str/; |
d3c47673 |
17 | |
2820aea9 |
18 | use namespace::clean 0.08; |
d3c47673 |
19 | |
2820aea9 |
20 | use MooseX::Types 0.30 -declare => [qw( DateTime Duration TimeZone Locale Now )]; |
4664d531 |
21 | |
22 | class_type "DateTime"; |
ec3f7a50 |
23 | class_type "DateTime::Duration"; |
4664d531 |
24 | class_type "DateTime::TimeZone"; |
25 | class_type "DateTime::Locale::root" => { name => "DateTime::Locale" }; |
26 | |
6903978c |
27 | subtype DateTime, as 'DateTime'; |
28 | subtype Duration, as 'DateTime::Duration'; |
29 | subtype TimeZone, as 'DateTime::TimeZone'; |
39b3fe23 |
30 | subtype Locale, as 'DateTime::Locale'; |
31 | |
32 | subtype( Now, |
33 | as Str, |
34 | where { $_ eq 'now' }, |
f25d5b8f |
35 | ($Moose::VERSION >= 2.0100 |
36 | ? Moose::Util::TypeConstraints::inline_as { |
37 | 'no warnings "uninitialized";'. |
38 | '!ref(' . $_[1] . ') and '. $_[1] .' eq "now"'; |
39 | } |
40 | : Moose::Util::TypeConstraints::optimize_as { |
41 | no warnings 'uninitialized'; |
42 | !ref($_[0]) and $_[0] eq 'now'; |
43 | } |
44 | ), |
39b3fe23 |
45 | ); |
6903978c |
46 | |
06eee7b1 |
47 | our %coercions = ( |
48 | DateTime => [ |
49 | from Num, via { 'DateTime'->from_epoch( epoch => $_ ) }, |
50 | from HashRef, via { 'DateTime'->new( %$_ ) }, |
51 | from Now, via { 'DateTime'->now }, |
52 | ], |
53 | "DateTime::Duration" => [ |
54 | from Num, via { DateTime::Duration->new( seconds => $_ ) }, |
55 | from HashRef, via { DateTime::Duration->new( %$_ ) }, |
56 | ], |
57 | "DateTime::TimeZone" => [ |
58 | from Str, via { DateTime::TimeZone->new( name => $_ ) }, |
59 | ], |
60 | "DateTime::Locale" => [ |
61 | from Moose::Util::TypeConstraints::find_or_create_isa_type_constraint("Locale::Maketext"), |
62 | via { DateTime::Locale->load($_->language_tag) }, |
63 | from Str, via { DateTime::Locale->load($_) }, |
64 | ], |
65 | ); |
66 | |
6903978c |
67 | for my $type ( "DateTime", DateTime ) { |
06eee7b1 |
68 | coerce $type => @{ $coercions{DateTime} }; |
6903978c |
69 | } |
70 | |
71 | for my $type ( "DateTime::Duration", Duration ) { |
06eee7b1 |
72 | coerce $type => @{ $coercions{"DateTime::Duration"} }; |
6903978c |
73 | } |
74 | |
75 | for my $type ( "DateTime::TimeZone", TimeZone ) { |
06eee7b1 |
76 | coerce $type => @{ $coercions{"DateTime::TimeZone"} }; |
6903978c |
77 | } |
4664d531 |
78 | |
06eee7b1 |
79 | for my $type ( "DateTime::Locale", Locale ) { |
80 | coerce $type => @{ $coercions{"DateTime::Locale"} }; |
81 | } |
4664d531 |
82 | |
83 | __PACKAGE__ |
84 | |
85 | __END__ |
86 | |
87 | =pod |
88 | |
89 | =head1 NAME |
90 | |
91 | MooseX::Types::DateTime - L<DateTime> related constraints and coercions for |
92 | Moose |
93 | |
94 | =head1 SYNOPSIS |
95 | |
6903978c |
96 | Export Example: |
97 | |
98 | use MooseX::Types::DateTime qw(TimeZone); |
99 | |
100 | has time_zone => ( |
101 | isa => TimeZone, |
102 | is => "rw", |
103 | coerce => 1, |
104 | ); |
105 | |
106 | Class->new( time_zone => "Africa/Timbuktu" ); |
107 | |
108 | Namespaced Example: |
109 | |
4664d531 |
110 | use MooseX::Types::DateTime; |
111 | |
112 | has time_zone => ( |
6903978c |
113 | isa => 'DateTime::TimeZone', |
4664d531 |
114 | is => "rw", |
115 | coerce => 1, |
116 | ); |
117 | |
118 | Class->new( time_zone => "Africa/Timbuktu" ); |
119 | |
120 | =head1 DESCRIPTION |
121 | |
122 | This module packages several L<Moose::Util::TypeConstraints> with coercions, |
123 | designed to work with the L<DateTime> suite of objects. |
124 | |
125 | =head1 CONSTRAINTS |
126 | |
127 | =over 4 |
128 | |
129 | =item L<DateTime> |
130 | |
ec3f7a50 |
131 | A class type for L<DateTime>. |
132 | |
133 | =over 4 |
134 | |
135 | =item from C<Num> |
136 | |
137 | Uses L<DateTime/from_epoch>. Floating values will be used for subsecond |
138 | percision, see L<DateTime> for details. |
139 | |
140 | =item from C<HashRef> |
141 | |
142 | Calls L<DateTime/new> with the hash entries as arguments. |
143 | |
144 | =back |
145 | |
6903978c |
146 | =item L<Duration> |
ec3f7a50 |
147 | |
148 | A class type for L<DateTime::Duration> |
149 | |
150 | =over 4 |
151 | |
152 | =item from C<Num> |
153 | |
154 | Uses L<DateTime::Duration/new> and passes the number as the C<seconds> argument. |
155 | |
156 | Note that due to leap seconds, DST changes etc this may not do what you expect. |
157 | For instance passing in C<86400> is not always equivalent to one day, although |
158 | there are that many seconds in a day. See L<DateTime/"How Date Math is Done"> |
159 | for more details. |
160 | |
161 | =item from C<HashRef> |
162 | |
163 | Calls L<DateTime::Duration/new> with the hash entries as arguments. |
164 | |
165 | =back |
4664d531 |
166 | |
167 | =item L<DateTime::Locale> |
168 | |
ec3f7a50 |
169 | A class type for L<DateTime::Locale::root> with the name L<DateTime::Locale>. |
170 | |
171 | =over 4 |
172 | |
173 | =item from C<Str> |
174 | |
175 | The string is treated as a language tag (e.g. C<en> or C<he_IL>) and given to |
4664d531 |
176 | L<DateTime::Locale/load>. |
177 | |
ec3f7a50 |
178 | =item from L<Locale::Maktext> |
179 | |
180 | The C<Locale::Maketext/language_tag> attribute will be used with L<DateTime::Locale/load>. |
181 | |
4664d531 |
182 | =item L<DateTime::TimeZone> |
183 | |
ec3f7a50 |
184 | A class type for L<DateTime::TimeZone>. |
185 | |
186 | =over 4 |
187 | |
188 | =item from C<Str> |
189 | |
190 | Treated as a time zone name or offset. See L<DateTime::TimeZone/USAGE> for more |
191 | details on the allowed values. |
192 | |
193 | Delegates to L<DateTime::TimeZone/new> with the string as the C<name> argument. |
4664d531 |
194 | |
ec3f7a50 |
195 | =back |
4664d531 |
196 | |
a43ee170 |
197 | =back |
198 | |
199 | =back |
200 | |
f83c2e2d |
201 | =head1 SEE ALSO |
202 | |
203 | L<MooseX::Types::DateTimeX> |
204 | |
205 | L<DateTime>, L<DateTimeX::Easy> |
206 | |
4664d531 |
207 | =head1 VERSION CONTROL |
208 | |
a9942c1b |
209 | This module is maintained using git. You can get the latest version from |
53e5b5b3 |
210 | L<git://git.moose.perl.org/MooseX-Types-DateTime.git>. |
4664d531 |
211 | |
212 | =head1 AUTHOR |
213 | |
214 | Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt> |
215 | |
f83c2e2d |
216 | John Napiorkowski E<lt>jjn1056 at yahoo.comE<gt> |
217 | |
4664d531 |
218 | =head1 COPYRIGHT |
219 | |
220 | Copyright (c) 2008 Yuval Kogman. All rights reserved |
221 | This program is free software; you can redistribute |
222 | it and/or modify it under the same terms as Perl itself. |
223 | |
224 | =cut |