our
$VERSION
=
'0.04'
;
has
'seconds'
=> (
is
=>
'rw'
,
isa
=> PositiveOrZeroInt,
default
=> 0);
has
'minutes'
=> (
is
=>
'rw'
,
isa
=> PositiveOrZeroInt,
default
=> 0);
has
'hours'
=> (
is
=>
'rw'
,
isa
=> PositiveOrZeroInt,
default
=> 0);
has
'days'
=> (
is
=>
'rw'
,
isa
=> PositiveOrZeroInt,
default
=> 0);
has
'weeks'
=> (
is
=>
'rw'
,
isa
=> PositiveOrZeroInt,
default
=> 0);
sub
to_seconds {
my
$self
=
shift
;
return
(
$self
->seconds * SECOND)
+ (
$self
->minutes * MINUTE)
+ (
$self
->hours * HOUR)
+ (
$self
->days * DAY)
+ (
$self
->weeks * WEEK);
}
sub
to_duration {
my
$self
=
shift
;
return
DateTime::Duration->new(
weeks
=>
$self
->weeks,
days
=>
$self
->days,
hours
=>
$self
->hours,
minutes
=>
$self
->minutes,
seconds
=>
$self
->seconds,
);
}
sub
parse {
my
$self
=
shift
;
my
(
$str
) =
@_
;
foreach
my
$token
(
split
(/\s+/,
$str
)) {
$self
->_parse_token(
$token
);
}
return
$self
;
}
sub
_parse_token {
my
$self
=
shift
;
my
(
$token
) =
@_
;
if
(
$token
=~ /^(\d+)(\D?)$/) {
my
$num
= $1;
my
$typ
= $2;
if
(
$typ
eq
's'
) {
$self
->seconds(
$self
->seconds +
$num
);
}
elsif
((
$typ
eq
'm'
)) {
$self
->minutes(
$self
->minutes +
$num
);
}
elsif
((
$typ
eq
'h'
)||(
$typ
eq
''
)) {
$self
->hours(
$self
->hours +
$num
);
}
elsif
(
$typ
eq
'd'
){
$self
->days(
$self
->days +
$num
);
}
elsif
(
$typ
eq
'w'
){
$self
->weeks(
$self
->weeks +
$num
);
}
else
{
croak
"$token has unknown type $typ"
;
}
}
else
{
croak
"$token not wellformed. <duration><wdhms>"
;
}
return
$self
;
}
1;