CatalystのTagCloudのプラグイン欲しいナァってことで、Catalyst::Plugin::Markdownをまねして作ってみた。Catalyst::Plugin::Markdownのソースがさらりとしているので、この部分とアノ部分いじればOKね、、、みたいのはわかるんだけど、何故動くのかさっぱしわからん。
結局、コードを書くよりも出来たコードが何故動くのかを理解する(したふり?)にほとんどの時間を使ってしまった。
- Class::Data::Inheritableって何ヨ?
- NEXT.pmさっぱしわかんね。
ほとんど上の二つのお勉強だ。
プラグイン自体はCatalyst::Plugin::TagCloudという名前で、
package Catalyst::Plugin::TagCloud; use strict; use warnings; use base 'Class::Data::Inheritable'; use HTML::TagCloud; our $VERSION = '0.01'; __PACKAGE__->mk_classdata('tagcloud'); __PACKAGE__->tagcloud( HTML::TagCloud->new ); 1;
とかやっておいて、コントローラーに
use Catalyst qw/-Debug ConfigLoader Static::Simple TagCloud/;
とプラグインを追加しておけば、$c->tagcloudはHTML::TagCloudのインスタンスなので
sub default : Private { my ( $self, $c ) = @_; $c->tagcloud->add("tag1","url1",10); $c->tagcloud->add("tag2","url2",15); $c->tagcloud->add("tag3","url3",50); my $html = $c->tagcloud->html_and_css(10); # Hello TagCloud $c->response->body( $html ); }
と書けばめでたくタグクラウドが出力されている。
で、Class::Data::Inheritableって何ヨ?ってことだがココみてなんとなく納得した気になったり。でも、ちゃんとわかってないのかも、、、、なんで常にインスタンスが返ってくるのか実はよくわからん。 HTML::TagCloud->newってなんどもnewされないのは何故だろうか。
sub setup { my $c = shift; $c->config->{markdown}->{empty_element_suffix} ||= ''; $c->config->{markdown}->{tab_width} ||= ''; return $c->NEXT::setup(@_); }; 1;
で、Catalyst::Plugin::Markdownにはさらにsetupっていうメソッドがあって、NEXT.pmが使われている。これはココのメルマガアーカイブでかなり納得したんだけれども、$c->config->{markdown}->{}がどうしてmy $html = $c->markdown->markdown($text);に関わってくるのかさっぱりなままだ。
結局今回のプラグインだとnewするときにlevelsの設定が出来ないので常にデフォルトの24であんま使えん。
みたいなのを$c->config->{tagcloud}->{levels}みたいなのをnewするときに指定してやりたいが、なんかいまいち。というより、そもそもClass::Data::Inheritable継承する必要がないような気がしてきた。my $cloud = HTML::TagCloud->new(levels=>10);
もうちょい、他のプラグイン読んだりしてちゃんと理解しないとあかんっぽい。勢いとまねまねで初めて書いたプラグインはやはりダメダメだったヨ。