モジュールにattr_accessor
のような、動的にメソッドを定義する機能を持たせたい時の書き方でハマったのでメモしておきます。
通常なら、クラスメソッドを定義したClassMethodsというサブモジュールを作成して、include元のクラスに継承させるのですが、これだとdefine_method
がClassMethods
のコンテキストで呼ばれるため、include元のクラスにはメソッドが定義されません。
module Hoge
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def my_define_method(name)
define_method(name) do
# ...
end
end
end
end
class_eval
を使って、include元のクラスコンテキストの中でdefine_methodを呼んだらうまく行きました。
module Hoge
def self.included(base)
base.class_eval do
def self.my_define_method(name)
define_method(name) do
# ...
end
end
end
end
end
class Fuga
include Hoge
my_define_method :my_method
end
fuga = Fuga.new
fuga.my_method