package Jifty::DBI::Filter::Duration;
use warnings;
use strict;
use base qw|Jifty::DBI::Filter|;
use Time::Duration qw();
use Time::Duration::Parse qw();
=head1 NAME
Jifty::DBI::Filter::Duration - Encodes time durations
=head1 DESCRIPTION
=head2 encode
If value is defined, then encode it using
L<Time::Duration::Parse/parse_duration>, otherwise do nothing. If the value
can't be parsed, then set it to undef.
=cut
sub encode {
my $self = shift;
my $value_ref = $self->value_ref;
return unless defined $$value_ref and length $$value_ref;
my ($parsed) = eval { Time::Duration::Parse::parse_duration($$value_ref) };
if ( not $@ ) {
$$value_ref = $parsed;
return 1;
}
else {
$$value_ref = undef;
return;
}
}
=head2 decode
If value is defined, then decode it using
L<Time::Duration/duration_exact> and L<Time::Duration/concise>,
otherwise do nothing.
=cut
sub decode {
my $self = shift;
my $value_ref = $self->value_ref;
return unless defined $$value_ref and length $$value_ref
and $$value_ref =~ /^\s*\d+\s*$/;
$$value_ref = Time::Duration::concise(Time::Duration::duration_exact($$value_ref));
}
=head1 SEE ALSO
L<Jifty::DBI::Filter>, L<Time::Duration>, L<Time::Duration::Parse>
=cut
1;