Original.pm
package Original;
use warnings;
use strict;
sub password { 'hogehoge'; }
sub name { 'angelos'; }
1;
Stealer.pm
package Stealer;
use warnings;
use strict;
use Class::Inspector;
use Data::Dumper;
use Sub::Install;
use UNIVERSAL::require;
sub steal_modules_from {
my $class = shift;
my $moniker = shift;
$moniker->require;
my $methods = Class::Inspector->functions( $moniker );
for my $method (@$methods) {
Sub::Install::install_sub(
{ from => $moniker ,
code => $method,
}
);
}
}
1;
Fixser.pm
package Fixser;
use warnings;
use strict;
use base qw/Stealer/;
use Class::Method::Modifiers::Fast;
__PACKAGE__->steal_modules_from('Original');
around 'name' => sub {
my $orig = shift;
my $res = $orig->(@_);
return $res . " is fun\n";
};
around 'password' => sub {
my $orig = shift;
my $res = $orig->(@_);
return "********\n";
};
1;
work.pl
#!/usr/bin/perl
use warnings;
use strict;
use Fixser;
print Fixser->name();
print Fixser->password();
結果
angelos is fun
********