MTのプラグインを作る時、最初はこう書く。
package MT::Plugin:myplugin01;
use MT::Plugin;
use base qw( MT::Plugin );my $plugin = MT::Plugin::myplugin01->new({
name => 'My Plugin 01',
});MT->add_plugin($plugin);
1;
これだけでもたぶん動く。
でもなんで定義していない「new」ができるわけ?って思ってた。
Perlのオブジェクト指向な書き方は慣れてなかったし、
baseを使うことで継承ができるとしらなかったから。
「use base qw( MT::Plugin )」でMT::Pluginを継承している。
だから、MT::Pluginにあるメソッドは使えるようになっている。
ところがMT::Pluginのソースコードにはnewというメソッドは
定義されていない。
その代わり、MT::Pluginのソースコードには次のように書いてある。
package MT::Plugin;
use strict;
use base qw( MT::Component );
というわけでMT::PluginはMT::Componentを継承しているということがわかる。
そして、MT::Componentにはきちんとnewというメソッドが定義されていて、
以下のようになっている。
sub new {
my $class = shift;
my ($self) = ref $_[0] ? @_ : {@_};
bless $self, $class;
$self->init();
$self;
}
というわけで、
MT::Plugin::myplugin01->new({ ... })のnewの丸括弧の中が
ごそっとクラス名にブレスされる(?)。
そして、$self->init()が呼ばれる。
sub init {
my $c = shift;
$c->init_registry() or return;# plugin callbacks are initialized after they finish loading. $c->init_callbacks() unless $c->isa('MT::Plugin'); $c;
}
そして、initはinit_registryを呼ぶことになる。
sub init_registry {
my $c = shift;
my $r = $c->load_registry("config.yaml");
if ( !$r ) {
return 1;
}$c->registry($r); # map key registry elements into metadata foreach my $prop (qw(version schema_version)) { $c->$prop( $r->{$prop} ) if exists $r->{$prop}; } $c->name( $r->{label} ) if exists $r->{label}; return 1;
}
init_registryはload_registryを呼ぶ。
(これでyaml ファイルが読まれる)