ziguzagu.org

Class::Singleton

Class::Singletonを使ってSingletonなクラスを作ってみたりします。

Package Foo;
use strict;
use warnings;
use base qw(Class::Singleton);

sub _new_instance {
    my $class = shift;
    return bless { }, $class;
}

sub bar {
    # なにか
}

1;

クライアントは、

#!/usr/bin/perl
use strict;
use warnings;
use Foo;
my $foo = Foo->instance();
$foo->bar;

という感じです。

ただ、実際には_new_instanceを呼んでしまえば余裕で複数インスタンスが作れちゃいます。とはいっても普通はそんなワンパクなことはしません。

一応、その辺を考慮したClass::StrongSingletonなんていうものも。UNIVERSAL::isa、callerとかやって、いろいろ調べてからインスタンスを生成します。でも、CPANでSingletonて名のつくモジュールで、そこまでやってるものは見当たりませんでした。Catalyst::Plugin::Singleton, Apache::SingletonとかもClass::Singleton的なゆるい(perlらしい?)Singleton。

ということで、Class::Singletonを使う方向で。