« 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,並挑選你想匯入的函式。
這上一個範例是一樣的效果,也就是由呼叫類別 Cat 指定了 { into => "Cat" }。
最初的目的是因為需要為 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