use warnings; use strict; { package Foo; use warnings::register; sub bar { warnings::warnif("bar: $_[0]"); } } { no warnings; Foo::bar("inside"); } Foo::bar("outside"); use warnings::register; use Carp; { no warnings; warn "warn"; warnings::warn("warnings::warn"); carp "carp"; warnings::warnif("inside 2"); } warnings::warnif("outside 2"); __END__ bar: outside at w.pl line 17. warn at w.pl line 23. warnings::warn at w.pl line 24. carp at w.pl line 25. #### sub _debug { my ($self, $lvl, @out) = @_; return if $self->{debug}<$lvl || !@out; print STDERR __PACKAGE__, " DEBUG: ", @out, "\n"; } # ... $self->_debug(2, ...);