« Parrot 1.0.0 "Haru Tatsu" Released! | Home | SD - peer-to-peer bug tracking system »

April 12, 2009

Class::Implant - No &import()

Class::Implant 是最近和 gugod 寫 Railsish 時,順手實做的模組,可以從 package 外部做 mixin 或是 inheritance,並挑選你想匯入的函式。

最初的目的是因為需要為 Controller 引入同名 Helper 的函式,但是又不想讓使用者在 Controller 裡面寫 use XxxHelper ,在 Rails 裡面,這只要在載入類別時進行
XxxController.send(:include, XxxHelper)
就可以辦到,雖然 Perl 裡面也可以寫
eval qq{ package XxxController; use XxxHelper; };
但是這樣還需要自己定義 XxxHelper::import(),在裡面指定想匯入的函式,實在相當不便。

使用 Class::Implant 的話,可以有比較簡單的等價寫法,
pacakge main;
use Class::Implant;
implant "XxxHelper", { into => "XxxController" };
如同其字面的意思,把 XxxHelper 中所有的函式都注入了 XxxController。

如果在 main 以外的模組內的話,預設的匯入目標就會變成該模組。也就是說,以上範例可以等價寫成如下:
package XxxController;
use Class::Implant;
implant "XxxHelper";
目前 0.02_01 版的實做還有 match 和 inherit 兩個選項可以使用,{ inherit => 1 } 可以讓匯入的模組出現在匯入目標的 @ISA 中,{ match => pattern } 則是只匯入符合 pattern 的函式。

如:
package main;
use Class::Implant;
implant qw(Foo Bar), { into => "Cat", match => qr{h\w+} };

代表只把 Foo,Bar 中 h 開頭的函式匯入 Cat 中。

同時還有 UNIVERSAL::Implant 模組,如同字面意思,這個模組只需要匯入一次,就可以在任何地方這樣寫:

Cat->implant qw(Foo Bar), { match => qr{h\w+} } 

這上一個範例是一樣的效果,也就是由呼叫類別 Cat 指定了 { into => "Cat" }。

No TrackBacks

TrackBack URL: http://chupei.pm.org/mt/mt-tb.cgi/545

Leave a comment

Pages

OpenID accepted here Learn more about OpenID

About this Entry

This page contains a single entry by shelling published on April 12, 2009 1:39 PM.

Parrot 1.0.0 "Haru Tatsu" Released! was the previous entry in this blog.

SD - peer-to-peer bug tracking system is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.