Blame lib/DateTime/Format/Builder/Parser/Dispatch.pm

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