use the "redefine" warning flag when importing DD to determine if redefined subs...
Chia-liang Kao [Mon, 30 May 2011 08:20:55 +0000 (16:20 +0800)]
lib/Devel/Declare/Context/Simple.pm
lib/Devel/Declare/MethodInstaller/Simple.pm

index a7e3116..51a2d05 100644 (file)
@@ -13,7 +13,7 @@ sub new {
 
 sub init {
   my $self = shift;
-  @{$self}{ qw(Declarator Offset) } = @_;
+  @{$self}{ qw(Declarator Offset WarningOnRedefined) } = @_;
   return $self;
 }
 
@@ -32,6 +32,11 @@ sub declarator {
   return $self->{Declarator}
 }
 
+sub warning_on_redefine {
+  my $self = shift;
+  return $self->{WarningOnRedefined}
+}
+
 sub skip_declarator {
   my $self = shift;
   my $decl = $self->declarator;
index 6038310..cfe506e 100644 (file)
@@ -17,10 +17,11 @@ 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) } } }
   );
 }
 
@@ -35,7 +36,11 @@ sub code_for {
       my $code = shift;
       # So caller() gets the subroutine name
       no strict 'refs';
-      *{$name} = subname $name => $code;
+      my $installer = $self->warning_on_redefine
+          ? sub { *{$name} = subname $name => $code; }
+          : sub { no warnings 'redefine';
+                  *{$name} = subname $name => $code; };
+      $installer->();
       return;
     };
   } else {