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