MT::Pluginの継承関係

| | トラックバック(1)

カテゴリ:

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 ファイルが読まれる)

トラックバック(1)

このブログ記事を参照しているブログ一覧: MT::Pluginの継承関係

このブログ記事に対するトラックバックURL: https://nozawashinichi.sakura.ne.jp/MT-4.25/mt-tb.cgi/331

【現在進行中の記事です】ちょっと作ってみる事にする。以下その時に参考にした事など... 続きを読む

comments powered by Disqus

このブログ記事について

このページは、Shinichi Nozawaが2009年3月 5日 15:58に書いたブログ記事です。

ひとつ前のブログ記事は「MTPlugin-Starterを使ってみる」です。

次のブログ記事は「MTはどうやって起動しているのか」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。