The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use strict;
use Carp;
use namespace::clean -except => 'meta';
has 'pattern' => (
isa => 'Maybe[Str]'
, is => 'rw'
, required => 1
, predicate => 'has_pattern'
);
around 'parse_datetime' => sub {
my ( $sub, $self, $time, $env, @args ) = @_;
croak "The key 'override' is not present in the env HashRef"
unless exists $env->{override}
;
croak '"time" is a required argument "time" for ->parse_datetime($time ...);'
unless defined $time;
;
## Set Pattern: from args, then from object
my $pattern;
if ( defined $env->{override}{pattern} ) {
$pattern = $env->{override}{pattern}
}
elsif ( $self->has_pattern ) {
$pattern = $self->pattern;
}
else {
croak "No pattern supplied to constructor or the call to parse_datetime"
}
$env->{ pattern } = $pattern;
## Calls the sub ( time, env, addtl args )
my $dt = $self->$sub( $time , $env , @args );
};
## KEEP IT HERE -- Roles in this care *ARE* order specific
1;
__END__
=head1 NAME
DateTimeX::Format::CustomPattern - A Moose::Role for building DateTime Formats that require patterns
=head1 DESCRIPTION
It adds an attribute "pattern", and behavies consistant with the call-overriding environment of L<DateTimeX::Format>.
=head1 SYNOPSIS
package DateTimeX::Format::RequiresPattern;
use Moose;
with 'DateTimeX::Format::CustomPattern';
package main;
my $dt = DateTimeX::Format::RequiresPattern->new({
locale => $locale
, time_zone => $timezone
, pattern => '%H:%M:%S'
, debug => 0|1
, defaults => 0|1
});
$dt->parse_datetime( $time, {pattern => '%H:%M'} );
=head1 OBJECT ENVIRONMENT
All of these slots correspond to your object environment: they can be supplied in the constructor, or through accessors.
=over 4
=item * pattern( $str )
Can be overridden in the call to ->parse_datetime.
=back