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!