既存クラスのメソッドを書き換えたファイルを何度も読み込む時の扱い方


[ruby -
既存クラスのメソッドに追加のオプションをつける方法](https://ja.stackoverflow.com/questions/6938/%e6%97%a2%e5%ad%98%e3%82%af%e3%83%a9%e3%82%b9%e3%81%ae%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%81%ab%e8%bf%bd%e5%8a%a0%e3%81%ae%e3%82%aa%e3%83%97%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e3%81%a4%e3%81%91%e3%82%8b%e6%96%b9%e6%b3%95)
にて既存クラスのメソッドの書き換えについてお聞きしたのですが、問題が書き換えの方法ではなくファイルの読み込み方にあったために別の質問として立てさせていただきました。

以下のように`selenium-
webdriver`の拡張をしたのですが、pry上で作業している時に`Selenium::Webdriver::Element`に他のメソッドを追加した時など何度も`load
'selenium_webdriver_ext.rb'` で呼び出すと2回目以降から `stack level too
deep`のエラーが発生してしまいます。

### selenium_webdriver_ext.rb

[code]

    class Selenium::WebDriver::Element
      alias_method :send_keys_orig, :send_keys  
      def send_keys(*args, clear: false)
        __send__(:clear) if clear
        send_keys_orig(*args)
      end
    end
    
[/code]

メソッドの書き換えを行ったファイルを`pry`から何度も読みだす時に何か良い方法はないでしょうか？




[Module#prepend](http://docs.ruby-
lang.org/ja/2.2.0/method/Module/i/prepend.html)を使いましょう。

[code]

    module SendKeysWithOption
      def send_keys(*args, clear: false)
        __send__(:clear) if clear
        super(*args)
      end
    end
    
    # 何度Module#prependが呼ばれても元のメソッドは消えないので問題なく動く
    Selenium::WebDriver::Element.prepend(SendKeysWithOption)
    
[/code]




ガード条件を付けてみました。  
`send_keys_orig` がすでに存在していればエイリアスメソッドは作らないようにしています。

[code]

    class Selenium::WebDriver::Element
      unless instance_methods.include?(:send_keys_orig)
        alias_method :send_keys_orig, :send_keys
      end 
    
      def send_keys(*args, clear: false)
        __send__(:clear) if clear
        send_keys_orig(*args)
      end
    end
    
[/code]

参考文献: [Effective
Ruby](http://www.amazon.co.jp/exec/obidos/ASIN/4798139823/junic05-22/ref=nosim/)
第5章

