aliasmethodchainをprependで書き換える
Module#prepend
メソッドの応用範囲はいろいろとありますが、一例としてRailsのaliasmethodchainと似た機能、prependで実装してみましょう。alias_method_chain
はRails黒魔術のひとつで、ライブラリのメソッドをちょこっと書き換える時などに重宝していました。詳しくは Rails: aliasmethodchain: 既存の処理を修正する常套手段 TECHSCORE BLOG などを参照してください。
実のところ、もともとalias_method_chain
はModule#prepend
の仮想敵でもありました。
prependメソッドは、RailsコミッタでもあるYehuda Katzの提案で、 これがあればRailsのaliasmethodchainを撲滅できる、と息巻いていた。 私もそう思う。
さて、それでは実例を見ていきます。最初のrequire群はalias_method_chain
を定義しているActiveSupportをBundlerでロードしている部分なので読み飛ばしてください。
drinkは(ベース)_with_(機能)
という名前にエイリアスが貼られ、機能追加版のメソッドが呼び出されます。また、もともとのロジックが(ベース)_without_(機能)
という名前で退避させられているのがわかります。
これをprependで書くと、次のようになります。
追加機能をモジュールの形で書き、ベースとなるクラスをオープンしてprependするだけです。すっきりと書けるうえ、Coffee
モジュールは他のクラスに対してもprependして流用できそうです。
実例としてalias_method_chain
を書き換えを紹介しましたが、Module#prepend
は他にもいろいろと活用できそうな機能です。何かカッコイイ例をご存じの方は教えて下さい。
以上で今回の記事は終わりです。