package Test;
use Moose;
has message => (
is => q/ro/,
isa => q/Str/,
);
#----------------------------
package Test2;
use Moose::Role;
has plugged => (
is => q/ro/,
isa => q/Test/,
);
sub _plugin_ {
my $pkg = shift;
my $subname = lcfirst $pkg;
{ no strict qw/refs/;
if (!defined &{"Test::$subname"})
{
*{"Test::$subname"} = sub {
my $self = shift;
my $obj = $pkg->new(@_, plugged => $self);
$obj->execute;
};
}
}
}
requires q/execute/;
#----------------------------
package Test3;
use Moose;
with 'Test2';
has message => (
is => q/ro/,
isa => q/Str/,
);
sub execute
{
my $self = shift;
print join(", ", $self->plugged->message, $self->message), "!\n";
}
__PACKAGE__->_plugin_;
#----------------------------
package main;
Test->new(message => "Hello")->test3(message => "World");
こんなんでいいのかなぁ





コメントする