#!/usr/bin/perl package MooseX::Types::DateTime; use strict; use warnings; our $VERSION = "0.03"; use DateTime (); use DateTime::Locale (); use DateTime::TimeZone (); use MooseX::Types::Moose qw/Num HashRef Str/; use namespace::clean; use MooseX::Types -declare => [qw( DateTime Duration TimeZone Locale Now )]; class_type "DateTime"; class_type "DateTime::Duration"; class_type "DateTime::TimeZone"; class_type "DateTime::Locale::root" => { name => "DateTime::Locale" }; subtype DateTime, as 'DateTime'; subtype Duration, as 'DateTime::Duration'; subtype TimeZone, as 'DateTime::TimeZone'; subtype Locale, as 'DateTime::Locale'; subtype( Now, as Str, where { $_ eq 'now' }, Moose::Util::TypeConstraints::optimize_as { no warnings 'uninitialized'; !ref($_[0]) and $_[0] eq 'now'; }, ); our %coercions = ( DateTime => [ from Num, via { 'DateTime'->from_epoch( epoch => $_ ) }, from HashRef, via { 'DateTime'->new( %$_ ) }, from Now, via { 'DateTime'->now }, ], "DateTime::Duration" => [ from Num, via { DateTime::Duration->new( seconds => $_ ) }, from HashRef, via { DateTime::Duration->new( %$_ ) }, ], "DateTime::TimeZone" => [ from Str, via { DateTime::TimeZone->new( name => $_ ) }, ], "DateTime::Locale" => [ from Moose::Util::TypeConstraints::find_or_create_isa_type_constraint("Locale::Maketext"), via { DateTime::Locale->load($_->language_tag) }, from Str, via { DateTime::Locale->load($_) }, ], ); for my $type ( "DateTime", DateTime ) { coerce $type => @{ $coercions{DateTime} }; } for my $type ( "DateTime::Duration", Duration ) { coerce $type => @{ $coercions{"DateTime::Duration"} }; } for my $type ( "DateTime::TimeZone", TimeZone ) { coerce $type => @{ $coercions{"DateTime::TimeZone"} }; } for my $type ( "DateTime::Locale", Locale ) { coerce $type => @{ $coercions{"DateTime::Locale"} }; } __PACKAGE__ __END__ =pod =head1 NAME MooseX::Types::DateTime - L related constraints and coercions for Moose =head1 SYNOPSIS Export Example: use MooseX::Types::DateTime qw(TimeZone); has time_zone => ( isa => TimeZone, is => "rw", coerce => 1, ); Class->new( time_zone => "Africa/Timbuktu" ); Namespaced Example: use MooseX::Types::DateTime; has time_zone => ( isa => 'DateTime::TimeZone', is => "rw", coerce => 1, ); Class->new( time_zone => "Africa/Timbuktu" ); =head1 DESCRIPTION This module packages several L with coercions, designed to work with the L suite of objects. =head1 CONSTRAINTS =over 4 =item L A class type for L. =over 4 =item from C Uses L. Floating values will be used for subsecond percision, see L for details. =item from C Calls L with the hash entries as arguments. =back =item L A class type for L =over 4 =item from C Uses L and passes the number as the C argument. Note that due to leap seconds, DST changes etc this may not do what you expect. For instance passing in C<86400> is not always equivalent to one day, although there are that many seconds in a day. See L for more details. =item from C Calls L with the hash entries as arguments. =back =item L A class type for L with the name L. =over 4 =item from C The string is treated as a language tag (e.g. C or C) and given to L. =item from L The C attribute will be used with L. =item L A class type for L. =over 4 =item from C Treated as a time zone name or offset. See L for more details on the allowed values. Delegates to L with the string as the C argument. =back =head1 SEE ALSO L L, L =head1 VERSION CONTROL L. Ask on #moose for commit bits. =head1 AUTHOR Yuval Kogman Enothingmuch@woobling.orgE John Napiorkowski Ejjn1056 at yahoo.comE =head1 COPYRIGHT Copyright (c) 2008 Yuval Kogman. All rights reserved This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut