make bump
[p5sagit/Devel-Declare.git] / lib / Devel / Declare.pm
CommitLineData
94caac6e 1package Devel::Declare;
4259f70d 2# ABSTRACT: Adding keywords to perl, in perl
94caac6e 3
4use strict;
5use warnings;
6use 5.008001;
7
b968549d 8our $VERSION = '0.006015';
0ba8c7aa 9
10use constant DECLARE_NAME => 1;
11use constant DECLARE_PROTO => 2;
53e3ab32 12use constant DECLARE_NONE => 4;
15d0d014 13use constant DECLARE_PACKAGE => 8+1; # name implicit
0ba8c7aa 14
86c3de80 15use vars qw(%declarators %declarator_handlers @ISA);
94caac6e 16use base qw(DynaLoader);
323ae557 17use Scalar::Util 'set_prototype';
39801454 18use B::Hooks::OP::Check 0.19;
94caac6e 19
20bootstrap Devel::Declare;
21
86c3de80 22@ISA = ();
23
8ec78a85 24initialize();
25
94caac6e 26sub import {
0ba8c7aa 27 my ($class, %args) = @_;
94caac6e 28 my $target = caller;
0ba8c7aa 29 if (@_ == 1) { # "use Devel::Declare;"
30 no strict 'refs';
15d0d014 31 foreach my $name (qw(NAME PROTO NONE PACKAGE)) {
53e3ab32 32 *{"${target}::DECLARE_${name}"} = *{"DECLARE_${name}"};
0ba8c7aa 33 }
34 } else {
35 $class->setup_for($target => \%args);
36 }
94caac6e 37}
38
39sub unimport {
40 my ($class) = @_;
41 my $target = caller;
42 $class->teardown_for($target);
43}
44
45sub setup_for {
46 my ($class, $target, $args) = @_;
47 setup();
0ba8c7aa 48 foreach my $key (keys %$args) {
49 my $info = $args->{$key};
50 my ($flags, $sub);
51 if (ref($info) eq 'ARRAY') {
52 ($flags, $sub) = @$info;
53 } elsif (ref($info) eq 'CODE') {
54 $flags = DECLARE_NAME;
55 $sub = $info;
840ebcbb 56 } elsif (ref($info) eq 'HASH') {
57 $flags = 1;
58 $sub = $info;
0ba8c7aa 59 } else {
840ebcbb 60 die "Info for sub ${key} must be [ \$flags, \$sub ] or \$sub or handler hashref";
0ba8c7aa 61 }
62 $declarators{$target}{$key} = $flags;
63 $declarator_handlers{$target}{$key} = $sub;
64 }
94caac6e 65}
66
67sub teardown_for {
68 my ($class, $target) = @_;
69 delete $declarators{$target};
0ba8c7aa 70 delete $declarator_handlers{$target};
94caac6e 71}
72
94caac6e 73my $temp_name;
0ba8c7aa 74my $temp_save;
94caac6e 75
76sub init_declare {
0f070758 77 my ($usepack, $use, $inpack, $name, $proto, $traits) = @_;
53e3ab32 78 my ($name_h, $XX_h, $extra_code)
9026391e 79 = $declarator_handlers{$usepack}{$use}->(
0f070758 80 $usepack, $use, $inpack, $name, $proto, defined(wantarray), $traits
53e3ab32 81 );
15d0d014 82 ($temp_name, $temp_save) = ([], []);
0ba8c7aa 83 if ($name) {
9026391e 84 $name = "${inpack}::${name}" unless $name =~ /::/;
840ebcbb 85 shadow_sub($name, $name_h);
0ba8c7aa 86 }
87 if ($XX_h) {
840ebcbb 88 shadow_sub("${inpack}::X", $XX_h);
0ba8c7aa 89 }
53e3ab32 90 if (defined wantarray) {
91 return $extra_code || '0;';
92 } else {
93 return;
94 }
94caac6e 95}
96
840ebcbb 97sub shadow_sub {
98 my ($name, $cr) = @_;
99 push(@$temp_name, $name);
100 no strict 'refs';
101 my ($pack, $pname) = ($name =~ m/(.+)::([^:]+)/);
102 push(@$temp_save, $pack->can($pname));
840ebcbb 103 no warnings 'redefine';
104 no warnings 'prototype';
105 *{$name} = $cr;
106 set_in_declare(~~@{$temp_name||[]});
107}
108
94caac6e 109sub done_declare {
110 no strict 'refs';
86c3de80 111 my $name = shift(@{$temp_name||[]});
0ba8c7aa 112 die "done_declare called with no temp_name stack" unless defined($name);
86c3de80 113 my $saved = shift(@$temp_save);
15d0d014 114 $name =~ s/(.*):://;
115 my $temp_pack = $1;
0ba8c7aa 116 delete ${"${temp_pack}::"}{$name};
117 if ($saved) {
118 no warnings 'prototype';
119 *{"${temp_pack}::${name}"} = $saved;
120 }
840ebcbb 121 set_in_declare(~~@{$temp_name||[]});
94caac6e 122}
123
323ae557 124sub build_sub_installer {
125 my ($class, $pack, $name, $proto) = @_;
126 return eval "
127 package ${pack};
128 my \$body;
129 sub ${name} (${proto}) :lvalue {\n"
003ac394 130 .' if (wantarray) {
c5912dc7 131 goto &$body;
003ac394 132 }
133 my $ret = $body->(@_);
86c3de80 134 return $ret;
323ae557 135 };
136 sub { ($body) = @_; };';
137}
138
139sub setup_declarators {
140 my ($class, $pack, $to_setup) = @_;
86c3de80 141 die "${class}->setup_declarators(\$pack, \\\%to_setup)"
142 unless defined($pack) && ref($to_setup) eq 'HASH';
143 my %setup_for_args;
323ae557 144 foreach my $name (keys %$to_setup) {
145 my $info = $to_setup->{$name};
146 my $flags = $info->{flags} || DECLARE_NAME;
147 my $run = $info->{run};
148 my $compile = $info->{compile};
149 my $proto = $info->{proto} || '&';
150 my $sub_proto = $proto;
151 # make all args optional to enable lvalue for DECLARE_NONE
152 $sub_proto =~ s/;//; $sub_proto = ';'.$sub_proto;
86c3de80 153 #my $installer = $class->build_sub_installer($pack, $name, $proto);
154 my $installer = $class->build_sub_installer($pack, $name, '@');
86c3de80 155 $installer->(sub :lvalue {
003ac394 156#{ no warnings 'uninitialized'; warn 'INST: '.join(', ', @_)."\n"; }
c5534496 157 if (@_) {
158 if (ref $_[0] eq 'HASH') {
159 shift;
003ac394 160 if (wantarray) {
161 my @ret = $run->(undef, undef, @_);
162 return @ret;
163 }
c5534496 164 my $r = $run->(undef, undef, @_);
165 return $r;
166 } else {
003ac394 167 return @_[1..$#_];
c5534496 168 }
86c3de80 169 }
170 return my $sv;
171 });
172 $setup_for_args{$name} = [
173 $flags,
174 sub {
0f070758 175 my ($usepack, $use, $inpack, $name, $proto, $shift_hashref, $traits) = @_;
176 my $extra_code = $compile->($name, $proto, $traits);
003ac394 177 my $main_handler = sub { shift if $shift_hashref;
c5534496 178 ("DONE", $run->($name, $proto, @_));
003ac394 179 };
86c3de80 180 my ($name_h, $XX);
181 if (defined $proto) {
182 $name_h = sub :lvalue { return my $sv; };
183 $XX = $main_handler;
c5534496 184 } elsif (defined $name && length $name) {
86c3de80 185 $name_h = $main_handler;
186 }
003ac394 187 $extra_code ||= '';
188 $extra_code = '}, sub {'.$extra_code;
86c3de80 189 return ($name_h, $XX, $extra_code);
190 }
191 ];
323ae557 192 }
86c3de80 193 $class->setup_for($pack, \%setup_for_args);
194}
195
196sub install_declarator {
197 my ($class, $target_pack, $target_name, $flags, $filter, $handler) = @_;
198 $class->setup_declarators($target_pack, {
199 $target_name => {
200 flags => $flags,
201 compile => $filter,
202 run => $handler,
203 }
204 });
323ae557 205}
206
04a8a223 207sub linestr_callback_rv2cv {
208 my ($name, $offset) = @_;
209 $offset += toke_move_past_token($offset);
210 my $pack = get_curstash_name();
211 my $flags = $declarators{$pack}{$name};
212 my ($found_name, $found_proto);
04a8a223 213 if ($flags & DECLARE_NAME) {
214 $offset += toke_skipspace($offset);
215 my $linestr = get_linestr();
216 if (substr($linestr, $offset, 2) eq '::') {
217 substr($linestr, $offset, 2) = '';
218 set_linestr($linestr);
219 }
220 if (my $len = toke_scan_word($offset, $flags & DECLARE_PACKAGE)) {
221 $found_name = substr($linestr, $offset, $len);
222 $offset += $len;
04a8a223 223 }
224 }
225 if ($flags & DECLARE_PROTO) {
226 $offset += toke_skipspace($offset);
227 my $linestr = get_linestr();
228 if (substr($linestr, $offset, 1) eq '(') {
229 my $length = toke_scan_str($offset);
230 $found_proto = get_lex_stuff();
231 clear_lex_stuff();
232 my $replace =
233 ($found_name ? ' ' : '=')
234 .'X'.(' ' x length($found_proto));
235 $linestr = get_linestr();
236 substr($linestr, $offset, $length) = $replace;
237 set_linestr($linestr);
238 $offset += $length;
04a8a223 239 }
240 }
241 my @args = ($pack, $name, $pack, $found_name, $found_proto);
04a8a223 242 $offset += toke_skipspace($offset);
243 my $linestr = get_linestr();
244 if (substr($linestr, $offset, 1) eq '{') {
245 my $ret = init_declare(@args);
246 $offset++;
247 if (defined $ret && length $ret) {
248 substr($linestr, $offset, 0) = $ret;
249 set_linestr($linestr);
250 }
251 } else {
252 init_declare(@args);
253 }
254 #warn "linestr now ${linestr}";
255}
256
569ac469 257sub linestr_callback_const {
04a8a223 258 my ($name, $offset) = @_;
259 my $pack = get_curstash_name();
260 my $flags = $declarators{$pack}{$name};
261 if ($flags & DECLARE_NAME) {
262 $offset += toke_move_past_token($offset);
263 $offset += toke_skipspace($offset);
264 if (toke_scan_word($offset, $flags & DECLARE_PACKAGE)) {
265 my $linestr = get_linestr();
266 substr($linestr, $offset, 0) = '::';
267 set_linestr($linestr);
268 }
269 }
569ac469 270}
271
272sub linestr_callback {
273 my $type = shift;
840ebcbb 274 my $name = $_[0];
275 my $pack = get_curstash_name();
276 my $handlers = $declarator_handlers{$pack}{$name};
277 if (ref $handlers eq 'CODE') {
278 my $meth = "linestr_callback_${type}";
279 __PACKAGE__->can($meth)->(@_);
280 } elsif (ref $handlers eq 'HASH') {
281 if ($handlers->{$type}) {
282 $handlers->{$type}->(@_);
283 }
284 } else {
285 die "PANIC: unknown thing in handlers for $pack $name: $handlers";
286 }
569ac469 287}
288
94caac6e 289=head1 NAME
290
7e31b6e3 291Devel::Declare - Adding keywords to perl, in perl
94caac6e 292
293=head1 SYNOPSIS
294
1795217c 295 use Method::Signatures;
296 # or ...
297 use MooseX::Declare;
298 # etc.
299
300 # Use some new and exciting syntax like:
301 method hello (Str :$who, Int :$age where { $_ > 0 }) {
302 $self->say("Hello ${who}, I am ${age} years old!");
303 }
304
305=head1 DESCRIPTION
306
307L<Devel::Declare> can install subroutines called declarators which locally take
308over Perl's parser, allowing the creation of new syntax.
309
310This document describes how to create a simple declarator.
311
312=head1 USAGE
313
314We'll demonstrate the usage of C<Devel::Declare> with a motivating example: a new
315C<method> keyword, which acts like the builtin C<sub>, but automatically unpacks
316C<$self> and the other arguments.
317
318 package My::Methods;
319 use Devel::Declare;
320
321=head2 Creating a declarator with C<setup_for>
322
323You will typically create
324
325 sub import {
326 my $class = shift;
327 my $caller = caller;
328
329 Devel::Declare->setup_for(
330 $caller,
331 { method => { const => \&parser } }
332 );
333 no strict 'refs';
334 *{$caller.'::method'} = sub (&) {};
335 }
336
337Starting from the end of this import routine, you'll see that we're creating a
338subroutine called C<method> in the caller's namespace. Yes, that's just a normal
339subroutine, and it does nothing at all (yet!) Note the prototype C<(&)> which means
340that the caller would call it like so:
341
342 method {
343 my ($self, $arg1, $arg2) = @_;
344 ...
345 }
346
347However we want to be able to call it like this
348
349 method foo ($arg1, $arg2) {
350 ...
351 }
352
353That's why we call C<setup_for> above, to register the declarator 'method' with a custom
354parser, as per the next section. It acts on an optype, usually C<'const'> as above.
355(Other valid values are C<'check'> and C<'rv2cv'>).
356
357For a simpler way to install new methods, see also L<Devel::Declare::MethodInstaller::Simple>
358
359=head2 Writing a parser subroutine
360
361This subroutine is called at I<compilation> time, and allows you to read the custom
362syntaxes that we want (in a syntax that may or may not be valid core Perl 5) and
363munge it so that the result will be parsed by the C<perl> compiler.
364
365For this example, we're defining some globals for convenience:
366
2ee34f20 367 our ($Declarator, $Offset);
1795217c 368
369Then we define a parser subroutine to handle our declarator. We'll look at this in
370a few chunks.
371
372 sub parser {
373 local ($Declarator, $Offset) = @_;
374
375C<Devel::Declare> provides some very low level utility methods to parse character
376strings. We'll define some useful higher level routines below for convenience,
377and we can use these to parse the various elements in our new syntax.
378
379Notice how our parser subroutine is invoked at compile time,
380when the C<perl> parser is pointed just I<before> the declarator name.
381
382 skip_declarator; # step past 'method'
383 my $name = strip_name; # strip out the name 'foo', if present
384 my $proto = strip_proto; # strip out the prototype '($arg1, $arg2)', if present
385
386Now we can prepare some code to 'inject' into the new subroutine. For example we
387might want the method as above to have C<my ($self, $arg1, $arg2) = @_> injected at
388the beginning of it. We also do some clever stuff with scopes that we'll look
389at shortly.
390
391 my $inject = make_proto_unwrap($proto);
392 if (defined $name) {
393 $inject = scope_injector_call().$inject;
394 }
395 inject_if_block($inject);
396
397We've now managed to change C<method ($arg1, $arg2) { ... }> into C<method {
398injected_code; ... }>. This will compile... but we've lost the name of the
399method!
400
401In a cute (or horrifying, depending on your perspective) trick, we temporarily
402change the definition of the subroutine C<method> itself, to specialise it with
403the C<$name> we stripped, so that it assigns the code block to that name.
404
405Even though the I<next> time C<method> is compiled, it will be
406redefined again, C<perl> caches these definitions in its parse
407tree, so we'll always get the right one!
408
409Note that we also handle the case where there was no name, allowing
410an anonymous method analogous to an anonymous subroutine.
411
412 if (defined $name) {
413 $name = join('::', Devel::Declare::get_curstash_name(), $name)
414 unless ($name =~ /::/);
415 shadow(sub (&) { no strict 'refs'; *{$name} = shift; });
416 } else {
417 shadow(sub (&) { shift });
418 }
419 }
420
421
422=head2 Parser utilities in detail
423
424For simplicity, we're using global variables like C<$Offset> in these examples.
425You may prefer to look at L<Devel::Declare::Context::Simple>, which
426encapsulates the context much more cleanly.
427
428=head3 C<skip_declarator>
429
430This simple parser just moves across a 'token'. The common case is
431to skip the declarator, i.e. to move to the end of the string
432'method' and before the prototype and code block.
433
2ee34f20 434 sub skip_declarator {
435 $Offset += Devel::Declare::toke_move_past_token($Offset);
436 }
1795217c 437
438=head4 C<toke_move_past_token>
439
440This builtin parser simply moves past a 'token' (matching C</[a-zA-Z_]\w*/>)
441It takes an offset into the source document, and skips past the token.
442It returns the number of characters skipped.
443
444=head3 C<strip_name>
445
446This parser skips any whitespace, then scans the next word (again matching a
447'token'). We can then analyse the current line, and manipulate it (using pure
448Perl). In this case we take the name of the method out, and return it.
449
2ee34f20 450 sub strip_name {
451 skipspace;
452 if (my $len = Devel::Declare::toke_scan_word($Offset, 1)) {
453 my $linestr = Devel::Declare::get_linestr();
454 my $name = substr($linestr, $Offset, $len);
455 substr($linestr, $Offset, $len) = '';
456 Devel::Declare::set_linestr($linestr);
457 return $name;
458 }
459 return;
460 }
1795217c 461
462=head4 C<toke_scan_word>
463
464This builtin parser, given an offset into the source document,
465matches a 'token' as above but does not skip. It returns the
466length of the token matched, if any.
467
468=head4 C<get_linestr>
469
470This builtin returns the full text of the current line of the source document.
471
472=head4 C<set_linestr>
473
474This builtin sets the full text of the current line of the source document.
2627a85c 475Beware that injecting a newline into the middle of the line is likely
476to fail in surprising ways. Generally, Perl's parser can rely on the
477`current line' actually being only a single line. Use other kinds of
478whitespace instead, in the code that you inject.
1795217c 479
480=head3 C<skipspace>
481
482This parser skips whitsepace.
483
484 sub skipspace {
485 $Offset += Devel::Declare::toke_skipspace($Offset);
486 }
487
488=head4 C<toke_skipspace>
489
490This builtin parser, given an offset into the source document,
491skips over any whitespace, and returns the number of characters
492skipped.
493
494=head3 C<strip_proto>
495
496This is a more complex parser that checks if it's found something that
497starts with C<'('> and returns everything till the matching C<')'>.
498
2ee34f20 499 sub strip_proto {
500 skipspace;
1795217c 501
2ee34f20 502 my $linestr = Devel::Declare::get_linestr();
503 if (substr($linestr, $Offset, 1) eq '(') {
504 my $length = Devel::Declare::toke_scan_str($Offset);
505 my $proto = Devel::Declare::get_lex_stuff();
506 Devel::Declare::clear_lex_stuff();
507 $linestr = Devel::Declare::get_linestr();
508 substr($linestr, $Offset, $length) = '';
509 Devel::Declare::set_linestr($linestr);
510 return $proto;
511 }
512 return;
513 }
1795217c 514
515=head4 C<toke_scan_str>
516
517This builtin parser uses Perl's own parsing routines to match a "stringlike"
518expression. Handily, this includes bracketed expressions (just think about
519things like C<q(this is a quote)>).
520
521Also it Does The Right Thing with nested delimiters (like C<q(this (is (a) quote))>).
522
78bb475d 523It returns the effective length of the expression matched. Really, what
524it returns is the difference in position between where the string started,
525within the buffer, and where it finished. If the string extended across
526multiple lines then the contents of the buffer may have been completely
527replaced by the new lines, so this position difference is not the same
528thing as the actual length of the expression matched. However, because
529moving backward in the buffer causes problems, the function arranges
530for the effective length to always be positive, padding the start of
531the buffer if necessary.
532
533Use C<get_lex_stuff> to get the actual matched text, the content of
534the string. Because of the behaviour around multiline strings, you
535can't reliably get this from the buffer. In fact, after the function
536returns, you can't rely on any content of the buffer preceding the end
537of the string.
1795217c 538
8449c31f 539If the string being scanned is not well formed (has no closing delimiter),
540C<toke_scan_str> returns C<undef>. In this case you cannot rely on the
541contents of the buffer.
542
1795217c 543=head4 C<get_lex_stuff>
544
545This builtin returns what was matched by C<toke_scan_str>. To avoid segfaults,
546you should call C<clear_lex_stuff> immediately afterwards.
547
548=head2 Munging the subroutine
549
550Let's look at what we need to do in detail.
551
552=head3 C<make_proto_unwrap>
553
554We may have defined our method in different ways, which will result
555in a different value for our prototype, as parsed above. For example:
556
557 method foo { # undefined
558 method foo () { # ''
559 method foo ($arg1) { # '$arg1'
560
561We deal with them as follows, and return the appropriate C<my ($self, ...) = @_;>
562string.
563
2ee34f20 564 sub make_proto_unwrap {
565 my ($proto) = @_;
566 my $inject = 'my ($self';
567 if (defined $proto) {
568 $inject .= ", $proto" if length($proto);
569 $inject .= ') = @_; ';
570 } else {
571 $inject .= ') = shift;';
572 }
573 return $inject;
574 }
1795217c 575
576=head3 C<inject_if_block>
577
578Now we need to inject it after the opening C<'{'> of the method body.
579We can do this with the building blocks we defined above like C<skipspace>
580and C<get_linestr>.
581
2ee34f20 582 sub inject_if_block {
583 my $inject = shift;
584 skipspace;
585 my $linestr = Devel::Declare::get_linestr;
586 if (substr($linestr, $Offset, 1) eq '{') {
587 substr($linestr, $Offset+1, 0) = $inject;
588 Devel::Declare::set_linestr($linestr);
589 }
590 }
94caac6e 591
1795217c 592=head3 C<scope_injector_call>
593
594We want to be able to handle both named and anonymous methods. i.e.
595
596 method foo () { ... }
597 my $meth = method () { ... };
598
599These will then get rewritten as
600
601 method { ... }
602 my $meth = method { ... };
603
604where 'method' is a subroutine that takes a code block. Spot the problem?
605The first one doesn't have a semicolon at the end of it! Unlike 'sub' which
606is a builtin, this is just a normal statement, so we need to terminate it.
6c1cecd4 607Luckily, using C<B::Hooks::EndOfScope>, we can do this!
1795217c 608
6c1cecd4 609 use B::Hooks::EndOfScope;
1795217c 610
611We'll add this to what gets 'injected' at the beginning of the method source.
612
613 sub scope_injector_call {
614 return ' BEGIN { MethodHandlers::inject_scope }; ';
2ee34f20 615 }
1795217c 616
5bcdf810 617So at the beginning of every method, we are passing a callback that will get invoked
1795217c 618at the I<end> of the method's compilation... i.e. exactly then the closing C<'}'>
619is compiled.
620
621 sub inject_scope {
6c1cecd4 622 on_scope_end {
1795217c 623 my $linestr = Devel::Declare::get_linestr;
624 my $offset = Devel::Declare::get_linestr_offset;
625 substr($linestr, $offset, 0) = ';';
626 Devel::Declare::set_linestr($linestr);
6c1cecd4 627 };
2ee34f20 628 }
94caac6e 629
1795217c 630=head2 Shadowing each method.
631
632=head3 C<shadow>
94caac6e 633
1795217c 634We override the current definition of 'method' using C<shadow>.
94caac6e 635
1795217c 636 sub shadow {
637 my $pack = Devel::Declare::get_curstash_name;
638 Devel::Declare::shadow_sub("${pack}::${Declarator}", $_[0]);
2ee34f20 639 }
94caac6e 640
1795217c 641For a named method we invoked like this:
642
643 shadow(sub (&) { no strict 'refs'; *{$name} = shift; });
644
645So in the case of a C<method foo { ... }>, this call would redefine C<method>
646to be a subroutine that exports 'sub foo' as the (munged) contents of C<{...}>.
647
648The case of an anonymous method is also cute:
649
650 shadow(sub (&) { shift });
651
652This means that
653
654 my $meth = method () { ... };
655
656is rewritten with C<method> taking the codeblock, and returning it as is to become
657the value of C<$meth>.
658
659=head4 C<get_curstash_name>
660
661This returns the package name I<currently being compiled>.
662
663=head4 C<shadow_sub>
664
665Handles the details of redefining the subroutine.
666
667=head1 SEE ALSO
668
669One of the best ways to learn C<Devel::Declare> is still to look at
670modules that use it:
671
672L<http://cpants.perl.org/dist/used_by/Devel-Declare>.
94caac6e 673
dcf29eb6 674=head1 AUTHORS
94caac6e 675
502ba90e 676Matt S Trout - E<lt>mst@shadowcat.co.ukE<gt> - original author
94caac6e 677
02f5a508 678Company: http://www.shadowcat.co.uk/
94caac6e 679Blog: http://chainsawblues.vox.com/
680
1795217c 681Florian Ragwitz E<lt>rafl@debian.orgE<gt> - maintainer
682
0df492b9 683osfameron E<lt>osfameron@cpan.orgE<gt> - first draft of documentation
dcf29eb6 684
107322d1 685=head1 COPYRIGHT AND LICENSE
686
09addf7a 687This library is free software under the same terms as perl itself
688
107322d1 689Copyright (c) 2007, 2008, 2009 Matt S Trout
690
691Copyright (c) 2008, 2009 Florian Ragwitz
94caac6e 692
09addf7a 693stolen_chunk_of_toke.c based on toke.c from the perl core, which is
694
695Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
6962000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
94caac6e 697
698=cut
699
7001;