class Duration::Gregorian is Duration;
use Date::Format::ISO8601;
our $iso8601_duration_re_anchored = rx:perl5/^$iso8601_duration_re$/;
has Int $.year;
has Int $.month;
has Int $.day;
has Int $.hour;
has Int $.minute;
has $.second;
# do subs that get declared first "win" the MMD war?
multi sub duration( Int|Real ?$seconds ) returns Duration::Gregorian is export {
duration(:second($seconds));
}
multi sub duration( Int ?$year, Int ?$month, Int ?$day,
Int ?$hour, Int ?$minute, Int|Real ?$second #)
)
returns Duration::Gregorian is export {
Duration::Gregorian.new( :year($year), :month($month), :day($day),
:hour($hour), :minute($minute), :second($second),
);
}
# convert from an iso duration
multi method duration( Str $iso8601 ) returns Duration::Gregorian is export {
# FIXME - missing XXXX
$iso8601 ~~ $iso8601_duration_re_anchored
or die "can't match '$iso8601' to available ISO-8601 duration formats";
=pod
my $duration;
if ( defined $0 ) {
$duration = duration($/[1..7]);
if ( defined $8 ) {
$duration.end = duration($/[9..17]);
}
}
elsif ( defined $/[18] ) {
my $start = date($/[19..27]);
if ( defined $/[28] ) {
$duration = duration($/[29..35]);
$duration.start = $start;
} else {
my $end = date($/[37..35]);
$duration = Duration::Gregorian.new
( :start($start), :end($end) );
}
} else {
!!!
}
=cut
return $duration;
}
# operations with Duration::Gregorian constructors..
##multi method infix:<+>( $self: Str|Int|Real $iso8601_dur ) {
#$self + duration($iso8601_dur);
#}
##multi method infix:<->( $self: Int|Real $iso8601_dur ) {
#$self + duration($iso8601_dur);
#}
#multi method infix:<->( $self: Str $what ) {
#my $other = eval { date($what) };
#if ( $other ) {
#return $self - $other;
#} else {
#return $self - duration($what);
#}
#}