Ruby 2.0 のModule#prependをPerl5で

IT Advent Calendarは気軽に他の言語の最新事情を知ることができるのでいいですね。

さて、Ruby 2.0ではmixinまわりの機能が大幅に拡張されるようです。
RubyConf 2010 キーノート(2) - Matzにっき
Module#prepend - alias_method_chainが滅ぶ日 - I am Cruby!
そこで、下記のエントリで紹介されているprependをPerlでもやってみました。というか、Moose+Role+aroundで同等のことができます。コードレイアウトはオリジナルコードに合わせているので併せてご覧ください。

#!perl -w
use 5.12.0; # use strict + use feature "say"

{
    package Person;
    use Any::Moose;

    sub speak {
        my($self, @args) = @_;
        say @args;
    }
}
{
    package Exclaimer;
    use Any::Moose '::Role';

    around speak => sub {
        my($next, $self, @args) = @_;
        $self->$next(@args, '!');
    };
}

{
    package Person;
    with 'Exclaimer';
}

Person->new->speak('Hello, world');
# => Hello, world!

with 'Exclaimer'はロール*1を適用するものなので、prependそのものはではありません。しかし、メソッド修飾子のaroundによって同等の効果を得ることができます。
See also Moose.
Enjoy!

*1:Moose用語ではトレートのことをロールという。