c8d7dd4566adbbcb6b440fcd76fcbf17187f93ef
[gitmo/MooseX-Types-DateTime-MoreCoercions.git] / lib / MooseX / Types / DateTime / MoreCoercions.pm
1 package MooseX::Types::DateTime::MoreCoercions;
2 use strict;
3 use warnings;
4
5 use Moose 0.41 ();
6 use DateTime 0.4302 ();
7 use DateTime::Duration 0.4302 ();
8 use DateTimeX::Easy 0.085 ();
9 use Time::Duration::Parse 0.06 qw(parse_duration);
10 use MooseX::Types::DateTime 0.07 ();
11 use MooseX::Types::Moose 0.04 qw/Num HashRef Str/;
12
13 use namespace::clean 0.08;
14
15 our $VERSION = '0.08';
16
17 use MooseX::Types 0.04 -declare => [qw( DateTime Duration)];
18
19 subtype DateTime, as MooseX::Types::DateTime::DateTime;
20 coerce( DateTime,
21     @{ $MooseX::Types::DateTime::coercions{DateTime} },
22     from Str, via { DateTimeX::Easy->new($_) },
23 );
24
25 subtype Duration, as MooseX::Types::DateTime::Duration;
26 coerce( Duration,
27     @{ $MooseX::Types::DateTime::coercions{"DateTime::Duration"} },
28     from Str, via { 
29         DateTime::Duration->new( 
30             seconds => parse_duration($_)
31         );
32     },
33 );
34
35 1;
36
37 __END__
38
39 =head1 NAME
40
41 MooseX::Types::DateTime::MoreCoercions - Extensions to L<MooseX::Types::DateTime>
42
43 =head1 SYNOPSIS
44
45     package MyApp::MyClass;
46
47     use MooseX::Types::DateTime::MoreCoercions qw( DateTime );
48
49     has created => (
50         isa => DateTime,
51         is => "rw",
52         coerce => 1,
53     );
54
55     my $instance = MyApp::MyClass->new(created=>'January 1, 1980');
56     print $instance->created->year; # is 1980
57
58     ## Coercions from the base type continue to work as normal.
59     my $instance = MyApp::MyClass->new(created=>{year=>2000,month=>1,day=>10});
60
61 Please see the test case for more example usage.
62
63 =head1 DESCRIPTION
64
65 This module builds on L<MooseX::Types::DateTime> to add additional custom types and coercions.  Since it builds on an existing type, all coercions and constraints are inherited.
66
67 =head1 SUBTYPES
68
69 This module defines the following additional subtypes.
70
71 =head2 DateTime
72
73 Subtype of L<MooseX::Types::DateTime/DateTime>.  Adds an additional coercion from strings.
74
75 Uses L<DateTimeX::Easy> to try and convert strings, like "yesterday" into a valid L<DateTime> object.  Please note that due to ambiguity with how different systems might localize their timezone, string parsing may not always return the most expected value.  IN general we try to localize to UTC whenever possible.  Feedback welcomed!
76
77 =head2 Duration
78
79 Subtype of L<MooseX::Types::DateTime/Duration> that coerces from a string.  We use the module L<Time::Duration::Parse> to attempt this.
80
81 =head1 CAVEATS
82
83 Firstly, this module uses L<DateTimeX::Easy> which is way to more DWIM than any sane person would desire. L<DateTimeX::Easy> works by falling back until something makes sense, this is variable. Furthermore, all the modules that L<DateTimeX::Easy> *can* use aren't required for "proper" function of L<DateTimeX::Easy>. What does this mean? Simple, your mileage may vary in your coercions because L<DateTimeX::Easy> is installation specific.
84
85 =head1 SEE ALSO
86
87 =over 4
88
89 =item * L<MooseX::Types::DateTime> Replacement for this module -- coercions with less voodoo
90
91 =item * L<DateTimeX::Easy> Backend of this module
92
93 =item * L<Time::Duration::Parse> Duration parsing backend for this module
94
95 =back
96
97 =head1 AUTHOR
98
99 John Napiorkowski E<lt>jjn1056 at yahoo.comE<gt>
100
101 Broken into a seperate package from L<MooseX::Types::DateTime> by Evan Carroll.
102
103 Forked from L<MooseX::Types::DateTimeX> and ported back to use
104 L<MooseX::Types::DateTime> by Dagfinn Ilmari MannsE<aring>ker
105 E<lt>ilmari@ilmari.orgE<gt>.
106
107 =head1 LICENSE
108
109     Copyright (c) 2008 John Napiorkowski.
110
111     This program is free software; you can redistribute
112     it and/or modify it under the same terms as Perl itself.