X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDevel%2FDeclare%2FMethodInstaller%2FSimple.pm;h=70c3618d6aec4eebd3481f6f1652caf47fc64480;hb=b9d2321d9176ae1e0cb328a9ecc3435035204ed7;hp=416711655a71665e485babb7c1dd46bfd3e871d8;hpb=5b27c9b27fb76cf9174e86a3ad98db42504023b2;p=p5sagit%2FDevel-Declare.git diff --git a/lib/Devel/Declare/MethodInstaller/Simple.pm b/lib/Devel/Declare/MethodInstaller/Simple.pm index 4167116..70c3618 100644 --- a/lib/Devel/Declare/MethodInstaller/Simple.pm +++ b/lib/Devel/Declare/MethodInstaller/Simple.pm @@ -7,6 +7,9 @@ use Sub::Name; use strict; use warnings; +our $VERSION = '0.006_021'; +$VERSION =~ tr/_//d; + sub install_methodhandler { my $class = shift; my %args = @_; @@ -15,13 +18,43 @@ sub install_methodhandler { *{$args{into}.'::'.$args{name}} = sub (&) {}; } + my $warnings = warnings::enabled("redefine"); my $ctx = $class->new(%args); Devel::Declare->setup_for( $args{into}, - { $args{name} => { const => sub { $ctx->parser(@_) } } } + { $args{name} => { const => sub { $ctx->parser(@_, $warnings) } } } ); } +sub code_for { + my ($self, $name) = @_; + + if (defined $name) { + my $pkg = $self->get_curstash_name; + $name = join( '::', $pkg, $name ) + unless( $name =~ /::/ ); + return sub (&) { + my $code = shift; + # So caller() gets the subroutine name + no strict 'refs'; + my $installer = $self->warning_on_redefine + ? sub { *{$name} = subname $name => $code; } + : sub { no warnings 'redefine'; + *{$name} = subname $name => $code; }; + $installer->(); + return; + }; + } else { + return sub (&) { shift }; + } +} + +sub install { + my ($self, $name ) = @_; + + $self->shadow( $self->code_for($name) ); +} + sub parser { my $self = shift; $self->init(@_); @@ -29,28 +62,20 @@ sub parser { $self->skip_declarator; my $name = $self->strip_name; my $proto = $self->strip_proto; + my $attrs = $self->strip_attrs; my @decl = $self->parse_proto($proto); my $inject = $self->inject_parsed_proto(@decl); if (defined $name) { $inject = $self->scope_injector_call() . $inject; } - $self->inject_if_block($inject); - if (defined $name) { - my $pkg = $self->get_curstash_name; - $name = join( '::', $pkg, $name ) - unless( $name =~ /::/ ); - $self->shadow( sub (&) { - my $code = shift; - # So caller() gets the subroutine name - no strict 'refs'; - *{$name} = subname $name => $code; - }); - } else { - $self->shadow(sub (&) { shift }); - } + $self->inject_if_block($inject, $attrs ? "sub ${attrs} " : ''); + + $self->install( $name ); + + return; } -sub parse_proto { } +sub parse_proto { '' } sub inject_parsed_proto { return $_[1];