1use strict; 2 3package HTML::FormFu::Deflator::CompoundDateTime; 4$HTML::FormFu::Deflator::CompoundDateTime::VERSION = '2.07'; 5# ABSTRACT: CompoundDateTime deflator 6 7use Moose; 8use MooseX::Attribute::Chained; 9extends 'HTML::FormFu::Deflator'; 10 11use HTML::FormFu::Constants qw( $EMPTY_STR ); 12use DateTime; 13use List::Util 1.33 qw( none ); 14use Carp qw( croak ); 15 16has field_order => ( is => 'rw', traits => ['Chained'] ); 17 18my @known_fields = qw( year month day hour minute second nanosecond time_zone ); 19 20sub deflator { 21 my ( $self, $value ) = @_; 22 23 return if !defined $value || $value eq $EMPTY_STR; 24 25 # do we have a DateTime object? 26 27 eval { $value->$_ for @known_fields }; 28 29 return $value if $@; 30 31 my ( $multi, @fields ) = @{ $self->parent->get_fields }; 32 33 if ( defined( my $order = $self->field_order ) ) { 34 for my $order (@$order) { 35 croak "unknown DateTime field_order name" 36 if none { $order eq $_ } @known_fields; 37 38 my $field = shift @fields; 39 40 $field->default( $value->$order ); 41 } 42 } 43 else { 44 for my $field (@fields) { 45 my $name = $field->name; 46 47 croak "unknown DateTime field name" 48 if none { $name eq $_ } @known_fields; 49 50 $field->default( $value->$name ); 51 } 52 } 53 54 return; 55} 56 57__PACKAGE__->meta->make_immutable; 58 591; 60 61__END__ 62 63=pod 64 65=encoding UTF-8 66 67=head1 NAME 68 69HTML::FormFu::Deflator::CompoundDateTime - CompoundDateTime deflator 70 71=head1 VERSION 72 73version 2.07 74 75=head1 SYNOPSIS 76 77 --- 78 element: 79 - type: Multi 80 name: date 81 82 elements: 83 - name: day 84 - name: month 85 - name: year 86 87 deflator: 88 - type: CompoundDateTime 89 90 # set the default 91 92 $form->get_field('date')->default( $datetime ); 93 94=head1 DESCRIPTION 95 96For use with a L<HTML::FormFu::Element::Multi> group of fields. 97 98Sets the default values of several fields from a single L<DateTime> value. 99 100By default, expects the field names to be any of the following: 101 102=over 103 104=item year 105 106=item month 107 108=item day 109 110=item hour 111 112=item minute 113 114=item second 115 116=item nanosecond 117 118=item time_zone 119 120=back 121 122=head1 METHODS 123 124=head2 field_order 125 126Arguments: \@order 127 128If your field names don't follow the convention listed above, you must 129provide an arrayref containing the above names, in the order they correspond 130with your own fields. 131 132 --- 133 element: 134 - type: Multi 135 name: date 136 137 elements: 138 - name: m 139 - name: d 140 - name: y 141 142 deflator: 143 - type: CompoundDateTime 144 field_order: 145 - month 146 - day 147 - year 148 149=head1 AUTHOR 150 151Carl Franks 152 153=head1 LICENSE 154 155This library is free software, you can redistribute it and/or modify it under 156the same terms as Perl itself. 157 158=head1 AUTHOR 159 160Carl Franks <cpan@fireartist.com> 161 162=head1 COPYRIGHT AND LICENSE 163 164This software is copyright (c) 2018 by Carl Franks. 165 166This is free software; you can redistribute it and/or modify it under 167the same terms as the Perl 5 programming language system itself. 168 169=cut 170