package Logger; use warnings; use strict; use Exporter qw{ import }; our @EXPORT = qw{ log_warn }; sub log_warn { warn @_ } __PACKAGE__ #### package Common; use warnings; use strict; use experimental qw( signatures ); use Logger; use Moose::Exporter; my ($import, $unimport, $init_meta) = Moose::Exporter->build_import_methods( as_is => [\&Logger::log_warn] ); sub import { goto &$import } __PACKAGE__ #### package MyObj; use Moose; use Common; use namespace::autoclean; use experimental qw{ signatures }; has value => (is => 'ro', required => 1); sub foo($self) { log_warn('Value too large') if $self->value > 10; } __PACKAGE__->meta->make_immutable #### #!/usr/bin/perl use warnings; use strict; use Test::More tests => 2 * 2; use Sub::Override; my @warnings; my $override; use MyObj; BEGIN { $override = 'Sub::Override'->new( 'MyObj::log_warn' => sub { push @warnings, $_[0] }); } for my $test ([1, undef, 'no warnings'], [11, 'Value too large', 'warnings']) { my ($value, $warnings, $name) = @$test; @warnings = (); my $o = bless {value => $value}, 'MyObj'; ok($o, 'constructs'); $o->foo; is($warnings[0], $warnings, $name); } #### t/01-basic.t .. 1..4 Cannot replace non-existent sub (MyObj::log_warn) at t/01-basic.t line 15. BEGIN failed--compilation aborted at t/01-basic.t line 16. # Looks like your test exited with 255 before it could output anything. Dubious, test returned 255 (wstat 65280, 0xff00) Failed 4/4 subtests Test Summary Report ------------------- t/01-basic.t (Wstat: 65280 Tests: 0 Failed: 0) Non-zero exit status: 255 Parse errors: Bad plan. You planned 4 tests but ran 0. #### #!/usr/bin/perl use warnings; use strict; use Test::More tests => 2 * 2; use Sub::Override; my @warnings; my $override; use Logger; BEGIN { $override = 'Sub::Override'->new( 'Logger::log_warn' => sub { 'WHATEVER' }); } use MyObj; BEGIN { *MyObj::log_warn = sub { push @warnings, $_[0] }; } for my $test ([1, undef, 'no warnings'], [11, 'Value too large', 'warnings']) { my ($value, $warnings, $name) = @$test; @warnings = (); my $o = bless {value => $value}, 'MyObj'; ok($o, 'constructs'); $o->foo; is($warnings[0], $warnings, $name); }