File Coverage

blib/lib/Parse/Keyword.pm
Criterion Covered Total %
statement 33 33 100.0
branch n/a
condition n/a
subroutine 8 8 100.0
pod n/a
total 41 41 100.0


line stmt bran cond sub pod time code
1             package Parse::Keyword;
2 24     24   1180986 use strict;
  24         34  
  24         529  
3 24     24   84 use warnings;
  24         36  
  24         428  
4 24     24   341 use 5.014;
  24         52  
5             # ABSTRACT: DEPRECATED: write syntax extensions in perl
6              
7             our $VERSION = '0.09';
8              
9 24     24   9069 use Devel::CallParser;
  24         47336  
  24         962  
10 24     24   110 use XSLoader;
  24         25  
  24         2442  
11              
12             XSLoader::load(
13             __PACKAGE__,
14             exists $Parse::Keyword::{VERSION} ? ${ $Parse::Keyword::{VERSION} } : (),
15             );
16              
17              
18              
19             sub import {
20 25     25   220 my $package = shift;
21 25         34 my ($keywords) = @_;
22              
23 25         179 my $caller = caller;
24              
25 25         60 for my $keyword (keys %$keywords) {
26 27         28 my $sub = do {
27 24     24   81 no strict 'refs';
  24         27  
  24         1857  
28 27         22 \&{ $caller . '::' . $keyword };
  27         103  
29             };
30 27         122 install_keyword_handler($sub, $keywords->{$keyword});
31             }
32              
33 25         72 my @helpers = qw(
34             lex_peek
35             lex_read
36             lex_read_space
37             lex_stuff
38             parse_block
39             parse_stmtseq
40             parse_fullstmt
41             parse_barestmt
42             parse_fullexpr
43             parse_listexpr
44             parse_termexpr
45             parse_arithexpr
46             compiling_package
47             );
48              
49 25         33 for my $helper (@helpers) {
50 24     24   83 no strict 'refs';
  24         26  
  24         1852  
51 325         197 *{ $caller . '::' . $helper } = \&{ __PACKAGE__ . '::' . $helper };
  325         2048  
  325         390  
52             }
53             }
54              
55              
56             1;
57              
58             __END__
59              
60             =pod
61              
62             =encoding UTF-8
63              
64             =head1 NAME
65              
66             Parse::Keyword - DEPRECATED: write syntax extensions in perl
67              
68             =head1 VERSION
69              
70             version 0.09
71              
72             =head1 SYNOPSIS
73              
74             use Parse::Keyword { try => \&try_parser };
75             use Exporter 'import';
76             our @EXPORT = 'try';
77              
78             sub try {
79             my ($try, $catch) = @_;
80             &Try::Tiny::try($try, ($catch ? (&Try::Tiny::catch($catch)) : ()));
81             }
82              
83             sub try_parser {
84             lex_read_space;
85             die "syntax error" unless lex_peek eq '{';
86             my $try = parse_block;
87             lex_read_space;
88              
89             my $catch;
90             if (lex_peek(6) =~ /^catch\b/) {
91             lex_read(5);
92             lex_read_space;
93             die "syntax error" unless lex_peek eq '{';
94             $catch = parse_block;
95             }
96              
97             return (sub { ($try, $catch) }, 1);
98             }
99              
100             =head1 DESCRIPTION
101              
102             =head2 DO NOT USE!
103              
104             This module has fundamental errors in the way it handles closures, which are
105             not fixable. Runtime keywords will never be able to work properly with the
106             current design of this module. There are certain cases where this module is
107             still safe to use (keywords that only have effect at compile time, or keywords
108             that never call any of the C<parse_*> functions), but that is limiting enough
109             to make this module mostly worthless, and I likely won't be continuing to
110             maintain it. Be warned!
111              
112             B<< NOTE: The API of this module is still in flux. I may make
113             backwards-incompatible changes as I figure out how it should look. >>
114              
115             This module allows you to write keyword-based syntax extensions without
116             requiring you to write any C code yourself. It is similar to L<Devel::Declare>,
117             except that it uses the Perl parser API introduced in Perl 5.14 in order to
118             allow you to parse parts of things using perl's own parser, rather than having
119             to fake it with balanced brace matching or other fragile things.
120              
121             To use this module, you should pass a hashref to the C<use> statement. The keys
122             of this hashref are subroutines in the current package which should have
123             special parsing behavior attached to them, and the values are coderefs which
124             should be used to implement the custom parsing behavior.
125              
126             The parsing coderefs will be called when perl encounters a call to the keyword
127             that you attached custom parsing to. The current parser state will be directly
128             after parsing the keyword. The parser function will receive the name of the
129             keyword as a parameter, and should return a coderef which, when called at
130             runtime, will produce the arguments to the function. In addition, if your
131             keyword should be parsed as a statement (for instance, if you don't want to
132             require a trailing semicolon), you can return a second, true value.
133              
134             In order to actually handle the parsing itself, this module also exports
135             various parsing functions, which you can call. See below for details.
136              
137             =head1 FUNCTIONS
138              
139             =head2 lex_peek($n)
140              
141             Returns a string consisting of the next C<$n> characters in the input (or next
142             one character, if C<$n> isn't given). This string may be shorter than C<$n>
143             characters if there are fewer than C<$n> characters remaining to read. The
144             current position in the buffer to be parsed is not moved. See L<<
145             perlapi/PL_parser->linestr >> and L<perlapi/lex_next_chunk> for more
146             information.
147              
148             NOTE: This function currently only returns text that is on the current line,
149             unless the current line has been fully read (via C<lex_read>). This is due to a
150             bug in perl itself, and this restriction will hopefully be lifted in a future
151             version of this module, so don't depend on it. See the L</BUGS> section for
152             more information.
153              
154             =head2 lex_read($n)
155              
156             Moves the current position in the parsing buffer forward by C<$n> characters
157             (or one character, if C<$n> isn't given). See L<perlapi/lex_read_to> for more
158             details.
159              
160             =head2 lex_read_space
161              
162             Moves the current position in the parsing buffer forward past any whitespace or
163             comments. See L<perlapi/lex_read_space> for more details.
164              
165             =head2 lex_stuff($str)
166              
167             Inserts C<$str> into the current parsing buffer at the current location, so
168             that future calls to C<lex_peek> and such will see it. Note that this does not
169             move the current position in the parsing buffer, so multiple calls to
170             C<lex_stuff> at the same location will end up inserted into the buffer in
171             reverse order. See L<perlapi/lex_stuff_sv> for more information.
172              
173             =head2 parse_block, parse_stmtseq, parse_fullstmt, parse_barestmt,
174             parse_fullexpr, parse_listexpr, parse_termexpr, parse_arithexpr
175              
176             These functions parse the specified amount of Perl code, and return a coderef
177             which will evaluate that code when executed. They each take an optional boolean
178             parameter that should be true if you are creating a subroutine which will be
179             going in the symbol table, or in other more obscure situations involving
180             closures (the CVf_ANON flag will be set on the created coderef if this is not
181             passed - see C<t/unavailable.t> in this distribution). See
182             L<perlapi/parse_block>, L<perlapi/parse_stmtseq>, L<perlapi/parse_fullstmt>,
183             L<perlapi/parse_barestmt>, L<perlapi/parse_fullexpr>, L<parse_listexpr>,
184             L<parse_termexpr>, and L<perlapi/parse_arithexpr> for more details.
185              
186             =head2 compiling_package
187              
188             Returns the name of the package that the keyword which is currently being
189             parsed was called in. This should be used instead of C<caller> if you want to
190             do something like install a subroutine in the calling package.
191              
192             =head1 BUGS
193              
194             Peeking into the next line is currently (as of 5.19.2) broken in perl if the
195             current line hasn't been fully consumed. This module works around this by just
196             not doing that. This shouldn't be an issue for the most part, since it will
197             only come up if you need to conditionally parse something based on a token that
198             can span multiple lines. Just keep in mind that if you're reading in a large
199             chunk of text, you'll need to alternate between calling C<lex_peek> and
200             C<lex_read>, or else you'll only be able to see text on the current line.
201              
202             This module also inherits the limitation from L<Devel::CallParser> that custom
203             parsing is only triggered if the keyword is called by its unqualified name
204             (C<try>, not C<Try::try>, for instance).
205              
206             This module doesn't yet work with lexical subs, such as via
207             L<Exporter::Lexical>. This will hopefully be fixed in the future, but will
208             likely require modifications to perl.
209              
210             =head1 SEE ALSO
211              
212             L<Devel::CallParser>
213              
214             L<Keyword::API>
215              
216             L<Devel::Declare>
217              
218             =head1 SUPPORT
219              
220             You can find this documentation for this module with the perldoc command.
221              
222             perldoc Parse::Keyword
223              
224             You can also look for information at:
225              
226             =over 4
227              
228             =item * MetaCPAN
229              
230             L<https://metacpan.org/release/Parse-Keyword>
231              
232             =item * RT: CPAN's request tracker
233              
234             L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Parse-Keyword>
235              
236             =item * Github
237              
238             L<https://github.com/haarg/Parse-Keyword>
239              
240             =back
241              
242             =for Pod::Coverage install_keyword_handler
243              
244             =head1 AUTHOR
245              
246             Jesse Luehrs <doy@tozt.net>
247              
248             =head1 COPYRIGHT AND LICENSE
249              
250             This software is Copyright (c) 2013 by Jesse Luehrs.
251              
252             This is free software, licensed under:
253              
254             The MIT (X11) License
255              
256             =cut