Hikiのプラグインファイルの読み込みは単純に書くと次のようになっているようだ。
plugin = Hiki::Plugin.new plugin.instance_eval(File.read(plugin_file))
つまりプラグインファイル中でのメソッド定義はPluginオブジェクト(ここではplugin)の特異メソッドとなると 言うことだ。このうちexport_plugin_methodsされたものだけがHiki上からユーザーが利用できる。 このことからプラグイン関数のエイリアスを定義するには
という2つのステップを踏めばよいということが分かるので、それをplugin/99alias.rbなどにでも書いてみる。
alias ref_image attach_view export_plugin_methods(:ref_image)
上の例でref_imageが2カ所にあるのをまとめたいとする。export_plugin_methodsは各プラグインファイル中で 1回しか呼べないので、次のような定義の仕方になるだろう。
def plugin_method_aliases(*pairs) pairs.each do |n, o| class <<self self end.module_eval { alias_method n, o } end export_plugin_methods(*(pairs.map {|n,| n})) end plugin_method_aliases [:ref_image, :attach_view], [:new_method, :old_method ], ...
pairs.eachのブロック部分について。素直に
class <<self alias_method n, o end
と書きたいところだが、特異クラス定義中ではまわりの環境(ここではnとo)が見れないので 若干トリッキーになっている。が、ここまでやるなら eval("alias #{n} #{o}") しろって話も……。