Skip to content
Hiroaki Otsu edited this page Apr 14, 2014 · 6 revisions

plsenseの拡張性について

plsenseには、 Module::Pluggable が使用されており、以下の処理を拡張することができます。

PPI::Documentの解析

モジュールのビルド の「PPI::Documentの解析」処理において、 以下の2つの名前空間にあるプラグインを呼び出します。

  • PlSense::Plugin::PPIBuilder
  • PlSense::Plugin::IncludeStmt

全体のフローとプラグインの関数が実行されるタイミングは以下のようになっています。

  • 「…または…実行」は、 PPI::Statement::Variable の場合、 variable_statement が実行されます。
  • プラグインは各々、 PlSense::Plugin::PPIBuilder / PlSense::Plugin::IncludeStmt を継承して下さい。
  • デフォルトで幾つかプラグインが存在するので、それらを参考にして下さい。

アドレスの検索

PlSense::AddressFinder による PPI::Tokenから アドレス / エンティティ を抽出する処理で、 単一のメソッド呼び出しが見つかった時、そのメソッド名に対応するプラグインを 以下の名前空間から探し、見つかれば、以降の抽出処理をそれに委譲します。

  • PlSense::Plugin::AddressFinder::Builtin
  • PlSense::Plugin::AddressFinder::Ext

以下のコードから得られたPPI::Tokenに対して find_address が実行されると、

grep { $_->get_name eq 'main' } @Hoge::Fuga::all_modules;

grep というメソッド名を得た後、 PlSense::Plugin::AddressFinder::Builtin::Grep::find_address を呼び出し、その戻り値を使用します。 上記の場合、 @Hoge::Fuga::all_modules.A というアドレスが得られます。

実装

プラグインは、その対象のメソッドに応じて、以下のように実装します。

  • 以下の名前空間に配置
  • 名前空間と同名のモジュールを継承
  • 自身の扱うメソッド名を、以下のメソッドで返す
名前空間 対象 自メソッド名を返すメソッド
PlSense::Plugin::AddressFinder::Builtin 組み込み関数 get_builtin_name
PlSense::Plugin::AddressFinder::Ext 組み込みでない関数 get_method_name

また、適切に以下のメソッドを実装します。

find_address 受け取ったPPI::Tokenのリストからアドレスを返す
find_address_or_entity 受け取ったPPI::Tokenのリストからアドレス/エンティティを返す
  • デフォルトで幾つかプラグインが存在するので、それらを参考にして下さい。
Clone this wiki locally