perlのUNIVERSALクラス
2007/06/02
パッケージ名->can( メソッド名 );
__PACKAGE__->can( $m );
ClassName->can( $m );
canメソッドはUNIVERSALクラスが提供している。
http://d.hatena.ne.jp/macperl/20070530/p1
UNIVERSALクラス。使ったことありませんでした。
今居るpackageにhoge関数が存在するかどうかを調べる。
print "hoge関数は存在する。\n" if __PACKAGE__->can("hoge");
動的に関数を呼出す場合はこの方法でチェックした方がいいですね。
UNIVERSALクラスは、全てのクラスのbaseクラスということですので、全てのクラスを拡張するということもできるようでした。
全てのクラスにdumpメソッドを定義する。
#!/usr/bin/perl use strict; use warnings; { #UNIVERSALクラスを拡張する。 no strict "refs"; *{"UNIVERSAL::dump"} = sub { my $self = shift; if (ref($self)) { use Data::Dumper; Dumper($self); } }; } package Foo; sub new { my $class = shift; return bless {data => 100}, $class; } package main; my $foo = new Foo; print $foo->dump;
実行結果
$VAR1 = bless( { 'data' => 100 }, 'Foo' );
まぁ、UNIVERSALクラスにメソッド追加を積極的に利用するとキモいですね。