静态方法和实例方法的实现方式不一样,代码如下:
class M
class << self
def save(tt,a)
#puts "save #{tt} #{t3}"
puts "save #{tt} #{a}"
end
# def reload(flag)
# puts "reloaded"
# end
def __create_rule_before( method, comment = '', &block)
return if method.to_s=='__create_rule_before'
puts "method= #{method} #{method.class}"
args = M.method(method).arity == 0 ? '' : '(*args)'
puts "args= #{args}"
b_id = "%04x" % block.object_id
old_method_name = :"__previous_#{method}_#{b_id}"
#alias_method old_method_name, method
puts "method= #{old_method_name} #{old_method_name.class}"
define_singleton_method :"__before_#{method}_#{b_id}", &block
# class_eval <<-EOT
# class <<M
# alias old_method_name method
# end
# EOT
a2 = "class << M\nalias :#{old_method_name} :#{method}\nend"
class_eval(a2)
class_eval <<-EOT
class << self
#alias old_method_name method
def #{method}#{args}
__before_#{method}_#{b_id}#{args}
puts "__previous_#{method}_#{b_id}#{args}"
__previous_#{method}_#{b_id}#{args}
end
end
EOT
end
end
M.singleton_methods.each do |name|
#Hook.hook_method name,self
puts self
M.__create_rule_before(name) { |*args| puts "BEFORE SAVE#{args}" }
end
end
M.save 'test me','a'