Filename | /2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/DateTime/Format/Builder/Parser/Dispatch.pm |
Statements | Executed 21 statements in 302µs |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 14µs | 17µs | BEGIN@2 | DateTime::Format::Builder::Parser::Dispatch::
1 | 1 | 1 | 9µs | 9µs | BEGIN@5 | DateTime::Format::Builder::Parser::Dispatch::
1 | 1 | 1 | 9µs | 41µs | BEGIN@4 | DateTime::Format::Builder::Parser::Dispatch::
1 | 1 | 1 | 8µs | 39µs | BEGIN@3 | DateTime::Format::Builder::Parser::Dispatch::
1 | 1 | 1 | 7µs | 16µs | BEGIN@78 | DateTime::Format::Builder::Parser::Dispatch::
0 | 0 | 0 | 0s | 0s | __ANON__[:111] | DateTime::Format::Builder::Parser::Dispatch::
0 | 0 | 0 | 0s | 0s | create_parser | DateTime::Format::Builder::Parser::Dispatch::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package DateTime::Format::Builder::Parser::Dispatch; | ||||
2 | 3 | 23µs | 2 | 20µs | # spent 17µs (14+3) within DateTime::Format::Builder::Parser::Dispatch::BEGIN@2 which was called:
# once (14µs+3µs) by DateTime::Format::Builder::Parser::BEGIN@1 at line 2 # spent 17µs making 1 call to DateTime::Format::Builder::Parser::Dispatch::BEGIN@2
# spent 3µs making 1 call to strict::import |
3 | 3 | 25µs | 2 | 70µs | # spent 39µs (8+31) within DateTime::Format::Builder::Parser::Dispatch::BEGIN@3 which was called:
# once (8µs+31µs) by DateTime::Format::Builder::Parser::BEGIN@1 at line 3 # spent 39µs making 1 call to DateTime::Format::Builder::Parser::Dispatch::BEGIN@3
# spent 31µs making 1 call to vars::import |
4 | 3 | 21µs | 2 | 73µs | # spent 41µs (9+32) within DateTime::Format::Builder::Parser::Dispatch::BEGIN@4 which was called:
# once (9µs+32µs) by DateTime::Format::Builder::Parser::BEGIN@1 at line 4 # spent 41µs making 1 call to DateTime::Format::Builder::Parser::Dispatch::BEGIN@4
# spent 32µs making 1 call to Exporter::import |
5 | 3 | 54µs | 1 | 9µs | # spent 9µs within DateTime::Format::Builder::Parser::Dispatch::BEGIN@5 which was called:
# once (9µs+0s) by DateTime::Format::Builder::Parser::BEGIN@1 at line 5 # spent 9µs making 1 call to DateTime::Format::Builder::Parser::Dispatch::BEGIN@5 |
6 | |||||
7 | =head1 NAME | ||||
8 | |||||
9 | DateTime::Format::Builder::Parser::Dispatch - Dispatch parsers by group | ||||
10 | |||||
11 | =head1 SYNOPSIS | ||||
12 | |||||
13 | package SampleDispatch; | ||||
14 | use DateTime::Format::Builder | ||||
15 | ( | ||||
16 | parsers => { | ||||
17 | parse_datetime => [ | ||||
18 | { | ||||
19 | Dispatch => sub { | ||||
20 | return 'fnerk'; | ||||
21 | } | ||||
22 | } | ||||
23 | ] | ||||
24 | }, | ||||
25 | groups => { | ||||
26 | fnerk => [ | ||||
27 | { | ||||
28 | regex => qr/^(\d{4})(\d\d)(\d\d)$/, | ||||
29 | params => [qw( year month day )], | ||||
30 | }, | ||||
31 | ] | ||||
32 | } | ||||
33 | ); | ||||
34 | |||||
35 | =head1 DESCRIPTION | ||||
36 | |||||
37 | C<Dispatch> adds another parser type to C<Builder> permitting | ||||
38 | dispatch of parsing according to group names. | ||||
39 | |||||
40 | =head1 SPECIFICATION | ||||
41 | |||||
42 | C<Dispatch> has just one key: C<Dispatch>. The value should be a | ||||
43 | reference to a subroutine that returns one of: | ||||
44 | |||||
45 | =over 4 | ||||
46 | |||||
47 | =item * | ||||
48 | |||||
49 | C<undef>, meaning no groups could be found. | ||||
50 | |||||
51 | =item * | ||||
52 | |||||
53 | An empty list, meaning no groups could be found. | ||||
54 | |||||
55 | =item * | ||||
56 | |||||
57 | A single string, meaning: use this group | ||||
58 | |||||
59 | =item * | ||||
60 | |||||
61 | A list of strings, meaning: use these groups in this order. | ||||
62 | |||||
63 | =back | ||||
64 | |||||
65 | Groups are specified much like the example in the L<SYNOPSIS>. | ||||
66 | They follow the same format as when you specify them for methods. | ||||
67 | |||||
68 | =head1 SIDEEFFECTS | ||||
69 | |||||
70 | Your group parser can also be a Dispatch parser. Thus you could | ||||
71 | potentially end up with an infinitely recursive parser. | ||||
72 | |||||
73 | =cut | ||||
74 | |||||
75 | 1 | 600ns | $VERSION = '0.78'; | ||
76 | |||||
77 | { | ||||
78 | 4 | 169µs | 2 | 26µs | # spent 16µs (7+9) within DateTime::Format::Builder::Parser::Dispatch::BEGIN@78 which was called:
# once (7µs+9µs) by DateTime::Format::Builder::Parser::BEGIN@1 at line 78 # spent 16µs making 1 call to DateTime::Format::Builder::Parser::Dispatch::BEGIN@78
# spent 9µs making 1 call to strict::unimport |
79 | 1 | 1µs | *dispatch_data = *DateTime::Format::Builder::dispatch_data; | ||
80 | 1 | 700ns | *params = *DateTime::Format::Builder::Parser::params; | ||
81 | } | ||||
82 | |||||
83 | DateTime::Format::Builder::Parser->valid_params( | ||||
84 | 1 | 3µs | 1 | 10µs | Dispatch => { # spent 10µs making 1 call to DateTime::Format::Builder::Parser::valid_params |
85 | type => CODEREF, | ||||
86 | } | ||||
87 | ); | ||||
88 | |||||
89 | sub create_parser | ||||
90 | { | ||||
91 | my ($self, %args) = @_; | ||||
92 | my $coderef = $args{Dispatch}; | ||||
93 | |||||
94 | return sub { | ||||
95 | my ($self, $date, $p, @args) = @_; | ||||
96 | return unless defined $date; | ||||
97 | my $class = ref($self)||$self; | ||||
98 | |||||
99 | my @results = $coderef->( $date ); | ||||
100 | return unless @results; | ||||
101 | return unless defined $results[0]; | ||||
102 | |||||
103 | for my $group (@results) | ||||
104 | { | ||||
105 | my $parser = $dispatch_data{$class}{$group}; | ||||
106 | die "Unknown parsing group: $class\n" unless defined $parser; | ||||
107 | my $rv = eval { $parser->parse( $self, $date, $p, @args ) }; | ||||
108 | return $rv unless $@ or not defined $rv; | ||||
109 | } | ||||
110 | return; | ||||
111 | }; | ||||
112 | } | ||||
113 | |||||
114 | 1 | 4µs | 1; | ||
115 | |||||
116 | __END__ |