ルビーのメタプログラミングの経験があれば、実際にはかなり簡単です。見てください:
module Ext
def self.included base
base.extend ClassMethods
end
module ClassMethods
def attr_accessor_with_client_reset name
define_method name do
instance_variable_get "@#{name}"
end
define_method "#{name}=" do |v|
instance_variable_set "@#{name}", v
@client = nil
end
end
end
end
class Foo
include Ext
attr_reader :client
def initialize
@foo = 0
@client = 'client'
end
attr_accessor_with_client_reset :foo
end
f = Foo.new
f.foo # => 0
f.client # => "client"
f.foo = 1
f.foo # => 1
f.client # => nil
このコードが完全に明確でない場合は、この本を強くお勧めします:メタプログラミングRuby。