もちろん!
naoyaグループ - naoyaの日記 - Perl で Singleton Methodということで Class::SingletonMethod みたいにクラス名を汚染しちゃうような方法以外で Singleton Method (特異メソッド) を実現する方法はないかなあ。
賢明で懸命なヒョウ本(持ってない人は上から買ってちょんまげ)の読者は、これを思いつくと思うのだけど。
package Object::SingletonMethod;
use 5.008001;
use strict;
use warnings;
use Carp;
use Data::Dumper;
our $VERSION = '0.01';
our $DEBUG = 1;
my %Method;
sub singleton_method {
my $self = shift;
my ( $method, $subref ) = @_;
ref $subref eq 'CODE'
or croak '$obj->singleton_method(name => sub{...})';
$Method{ $self + 0 }{$method} = $subref;
}
sub can {
my ( $self, $method ) = @_;
my $subref = $Method{ $self + 0 }{$method};
return $subref if $subref;
return $self->SUPER::can($method);
}
sub DESTROY {
my $self = shift;
$DEBUG and carp "Destroing $self";
delete $Method{ $self + 0 };
}
sub AUTOLOAD {
my $self = shift;
my $method = our $AUTOLOAD;
$method =~ s/.*:://;
$DEBUG and carp "($self)->$method";
if ( my $subref = $Method{ $self + 0 }{$method} ) {
$subref->( $self, @_ );
}
else {
my $pkg = ref $self;
croak qq(Can't locate object method "$method" via package "$pkg");
}
}
1;
__END__
以下で実証。
#
use strict;
use warnings;
use Data::Dumper();
package Foo;
use base 'Object::SingletonMethod';
sub new {
my $class = shift;
bless {@_} => $class;
}
sub dump{
my $self = shift;
local ($Data::Dumper::Terse) = 1;
return Data::Dumper::Dumper($self);
}
package main;
my $foo = Foo->new;
my $far = Foo->new;
$foo->singleton_method(
inc => sub {
my $self = shift;
$self->{_inc}++;
$self;
}
);
$foo->inc;
$foo->inc;
print "foo can inc? ", ( $foo->can('inc') ? "Yes" : "No" ), "\n";
print "foo can new? ", ( $foo->can('new') ? "Yes" : "No" ), "\n";
print "foo can pee? ", ( $foo->can('pee') ? "Yes" : "No" ), "\n";
print "far can inc? ", ( $far->can('inc') ? "Yes" : "No" ), "\n";
print "far can new? ", ( $far->can('new') ? "Yes" : "No" ), "\n";
print "far can pee? ", ( $far->can('pee') ? "Yes" : "No" ), "\n";
print $foo->dump;
実はこの特定のmy variableに$object + 0をキーにしてインスタンスをしまい込むという方法は、Inside-Out Objectと呼ばれる、比較的新しいPerlのObject実装法で、これをDamian流に徹底的に昇華させたのがClass::Std。これ、いつか詳細解説(つーか添削!)するつもりだけど、待てない人はロングテールなワンコ本→をじっくりお読みあれ。
Dan the Man with Too Many Ways to Do Too Many Things

このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。