関連
やること
特定クラスのインスタンスメソッド、クラスメソッドを別物に置き換えてみる。
別のモジュールで置き換えのon/offを実装してみる。
使った要素技術と参考にしたサイト
- alias_method
- remove_method
- クラスメソッドのエイリアス
- http://www.tktkgame.com/tkool/memo/rgss/self_alias.html
- http://stackoverflow.com/questions/2079240/removing-undefining-a-class-method
- モジュールメソッドのinlcude
- http://ref.xaio.jp/ruby/classes/module/included
やってみた
mock_methods.rb
class Hoge
def hoge; p "hoge"; end
def self.foo; p "foo"; end
end
module Mock
extend self
def on
::Hoge.class_eval do
alias_method :__hoge, :hoge; remove_method :hoge
class << ::Hoge; self; end.class_eval do
alias_method :__foo, :foo; remove_method :foo
end
include ::Mock::Hoge
end
end
def off
::Hoge.class_eval do
alias_method :hoge, :__hoge; remove_method :__hoge
class << ::Hoge; self; end.class_eval do
alias_method :foo, :__foo; remove_method :__foo
end
end
end
module Hoge
def hoge; p "hogeeeee"; end
module ClassMethods
def foo; p "fooooooo"; end
end
extend ClassMethods
def self.included(klass)
klass.extend ClassMethods
end
end
end
Hoge.new.hoge #=> "hoge"
Hoge.foo #=> "foo"
Mock.on
Hoge.new.hoge #=> "hogeeeee"
Hoge.foo #=> "fooooooo"
Mock.off
Hoge.new.hoge #=> "hoge"
Hoge.foo #=> "foo"