/lib/HTML/FormHandler/Field/Duration.pm

http://github.com/gshank/html-formhandler · Perl · 57 lines · 39 code · 16 blank · 2 comment · 1 complexity · 7a4dce6b146532d97f7229b65c7943aa MD5 · raw file

  1. package HTML::FormHandler::Field::Duration;
  2. # ABSTRACT: DateTime::Duration from HTML form values
  3. use Moose;
  4. extends 'HTML::FormHandler::Field::Compound';
  5. use DateTime;
  6. =head1 SubFields
  7. Subfield names:
  8. years, months, weeks, days, hours, minutes, seconds, nanoseconds
  9. For example:
  10. has_field 'duration' => ( type => 'Duration' );
  11. has_field 'duration.hours' => ( type => 'Hour' );
  12. has_field 'duration.minutes' => ( type => 'Minute' );
  13. Customize error message 'duration_invalid' (default 'Invalid value for [_1]: [_2]')
  14. =cut
  15. our $class_messages = {
  16. 'duration_invalid' => 'Invalid value for [_1]: [_2]',
  17. };
  18. sub get_class_messages {
  19. my $self = shift;
  20. return {
  21. %{ $self->next::method },
  22. %$class_messages,
  23. }
  24. }
  25. sub validate {
  26. my ($self) = @_;
  27. my @dur_parms;
  28. foreach my $child ( $self->all_fields ) {
  29. unless ( $child->has_value && $child->value =~ /^\d+$/ ) {
  30. $self->add_error( $self->get_message('duration_invalid'), $self->loc_label, $child->loc_label );
  31. next;
  32. }
  33. push @dur_parms, ( $child->accessor => $child->value );
  34. }
  35. # set the value
  36. my $duration = DateTime::Duration->new(@dur_parms);
  37. $self->_set_value($duration);
  38. }
  39. __PACKAGE__->meta->make_immutable;
  40. use namespace::autoclean;
  41. 1;