|
Packit |
9002b2 |
package DateTime::Format::Builder::Parser::Dispatch;
|
|
Packit |
9002b2 |
{
|
|
Packit |
9002b2 |
$DateTime::Format::Builder::Parser::Dispatch::VERSION = '0.81';
|
|
Packit |
9002b2 |
}
|
|
Packit |
9002b2 |
use strict;
|
|
Packit |
9002b2 |
use warnings;
|
|
Packit |
9002b2 |
use vars qw( %dispatch_data );
|
|
Packit |
9002b2 |
use Params::Validate qw( CODEREF validate );
|
|
Packit |
9002b2 |
use DateTime::Format::Builder::Parser;
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
{
|
|
Packit |
9002b2 |
no strict 'refs';
|
|
Packit |
9002b2 |
*dispatch_data = *DateTime::Format::Builder::dispatch_data;
|
|
Packit |
9002b2 |
*params = *DateTime::Format::Builder::Parser::params;
|
|
Packit |
9002b2 |
}
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
DateTime::Format::Builder::Parser->valid_params(
|
|
Packit |
9002b2 |
Dispatch => {
|
|
Packit |
9002b2 |
type => CODEREF,
|
|
Packit |
9002b2 |
}
|
|
Packit |
9002b2 |
);
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
sub create_parser {
|
|
Packit |
9002b2 |
my ( $self, %args ) = @_;
|
|
Packit |
9002b2 |
my $coderef = $args{Dispatch};
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
return sub {
|
|
Packit |
9002b2 |
my ( $self, $date, $p, @args ) = @_;
|
|
Packit |
9002b2 |
return unless defined $date;
|
|
Packit |
9002b2 |
my $class = ref($self) || $self;
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
my @results = $coderef->($date);
|
|
Packit |
9002b2 |
return unless @results;
|
|
Packit |
9002b2 |
return unless defined $results[0];
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
for my $group (@results) {
|
|
Packit |
9002b2 |
my $parser = $dispatch_data{$class}{$group};
|
|
Packit |
9002b2 |
die "Unknown parsing group: $class\n" unless defined $parser;
|
|
Packit |
9002b2 |
my $rv = eval { $parser->parse( $self, $date, $p, @args ) };
|
|
Packit |
9002b2 |
return $rv unless $@ or not defined $rv;
|
|
Packit |
9002b2 |
}
|
|
Packit |
9002b2 |
return;
|
|
Packit |
9002b2 |
};
|
|
Packit |
9002b2 |
}
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
1;
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
# ABSTRACT: Dispatch parsers by group
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
__END__
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=pod
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=head1 NAME
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
DateTime::Format::Builder::Parser::Dispatch - Dispatch parsers by group
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=head1 VERSION
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
version 0.81
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=head1 SYNOPSIS
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
package SampleDispatch;
|
|
Packit |
9002b2 |
use DateTime::Format::Builder
|
|
Packit |
9002b2 |
(
|
|
Packit |
9002b2 |
parsers => {
|
|
Packit |
9002b2 |
parse_datetime => [
|
|
Packit |
9002b2 |
{
|
|
Packit |
9002b2 |
Dispatch => sub {
|
|
Packit |
9002b2 |
return 'fnerk';
|
|
Packit |
9002b2 |
}
|
|
Packit |
9002b2 |
}
|
|
Packit |
9002b2 |
]
|
|
Packit |
9002b2 |
},
|
|
Packit |
9002b2 |
groups => {
|
|
Packit |
9002b2 |
fnerk => [
|
|
Packit |
9002b2 |
{
|
|
Packit |
9002b2 |
regex => qr/^(\d{4})(\d\d)(\d\d)$/,
|
|
Packit |
9002b2 |
params => [qw( year month day )],
|
|
Packit |
9002b2 |
},
|
|
Packit |
9002b2 |
]
|
|
Packit |
9002b2 |
}
|
|
Packit |
9002b2 |
);
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=head1 DESCRIPTION
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
C<Dispatch> adds another parser type to C<Builder> permitting
|
|
Packit |
9002b2 |
dispatch of parsing according to group names.
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=head1 SPECIFICATION
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
C<Dispatch> has just one key: C<Dispatch>. The value should be a
|
|
Packit |
9002b2 |
reference to a subroutine that returns one of:
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=over 4
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=item *
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
C<undef>, meaning no groups could be found.
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=item *
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
An empty list, meaning no groups could be found.
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=item *
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
A single string, meaning: use this group
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=item *
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
A list of strings, meaning: use these groups in this order.
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=back
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
Groups are specified much like the example in the L<SYNOPSIS>.
|
|
Packit |
9002b2 |
They follow the same format as when you specify them for methods.
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=head1 SIDEEFFECTS
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
Your group parser can also be a Dispatch parser. Thus you could
|
|
Packit |
9002b2 |
potentially end up with an infinitely recursive parser.
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=head1 SUPPORT
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
See L<DateTime::Format::Builder> for details.
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=head1 SEE ALSO
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
C<datetime@perl.org> mailing list.
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
http://datetime.perl.org/
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
L<perl>, L<DateTime>,
|
|
Packit |
9002b2 |
L<DateTime::Format::Builder>
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=head1 AUTHORS
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=over 4
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=item *
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
Dave Rolsky <autarch@urth.org>
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=item *
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
Iain Truskett
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=back
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=head1 COPYRIGHT AND LICENSE
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
This software is Copyright (c) 2013 by Dave Rolsky.
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
This is free software, licensed under:
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
The Artistic License 2.0 (GPL Compatible)
|
|
Packit |
9002b2 |
|
|
Packit |
9002b2 |
=cut
|