Ruby でメソッドが追加された時に別名で定義し直す

と、いうのを書いてみました。

[コード]

class X
    @@ignore = false
    def self.method_added name
        if @@ignore || name == :method_added
            @@ignore = false
            return
        end
        @@ignore = true

        alias_method "_#{name}", name
        remove_method name
    end

    def hoge
        :hoge
    end

    def foo
        :foo
    end
end

x = X.new
x._hoge
# => :hoge
x._foo
# => :foo

やってることは #method_added メソッドを利用して、『メソッドが追加された時』に処理をフックして、別名で定義し直すようにしています。