Ruby でクラスメソッドが定義された時に処理をフックする

Ruby でクラスメソッド、つまりクラスオブジェクトに対して特異メソッドが定義された時に処理をフックしたい場合は .singleton_method_added メソッドを『クラスメソッド』として定義します。

[コード]

class X
    # インスタンスメソッドに singleton_method_added を追加する
    def self.singleton_method_added name
        p name
    end

    # インスタンスメソッドを定義しても呼び出されない
    def homu
        
    end

    # クラスメソッドを定義した場合に .singleton_method_added が呼び出される
    def self.mado
        
    end
end

x = X.new

# インスタンスオブジェクトに対する特異メソッドを定義しても呼び出されない
def x.mami
    
end

[出力]

:singleton_method_added
:mado

.singleton_method_added の場合は、クラスメソッドとして定義した singleton_method_added 自身も呼び出されます。