Thanks a lot, but consider this:
-------------------------------------------------------------------------
require 'monitor'
class AutoMonitor
include MonitorMixin
def initialize(obj)
mon_initialize
@obj = obj
end
def method_missing(sym, *args, &block)
synchronize do
@obj.send(sym, *args, &block)
end
end
end
def sync obj
meth = obj.methods - %w{__send__ __id__}
klass = class << obj.extend(MonitorMixin); self; end
meth.each{|m|klass.module_eval "def #{m}(*a,&b)synchronize{super}end"}
obj
end
hash = {"test1" => 1, AutoMonitor.new("test2") => 2, sync('test3') => 3}
p hash.include?("test1") #=> true
p hash.include?(AutoMonitor.new("test1")) #=> false
p hash.include?("test2") #=> false
p hash.include?(AutoMonitor.new("test2")) #=> false
#but
p hash.include?("test1") #=> true
p hash.include?(sync("test1")) #=> true
p hash.include?("test3") #=> true
p hash.include?(sync("test3")) #=> true
-------------------------------------------------------------------------
Of course it is possible to enhance AutoMonitor to handle these cases,
but i like the 4 liner. :)
If only i could make this module_eval go away. (or at least use the
block form)
cheers
Simon
Patrick Hurley wrote:
> On 4/21/06, David Corbin <dcorbin / machturtle.com> wrote:
> [...]
> require 'monitor'
>
> class AutoMonitor
> include MonitorMixin
>
> def initialize(obj)
> mon_initialize
> @obj = obj
> end
>
> def method_missing(sym, *args, &block)
> synchronize do
> @obj.send(sym, *args, &block)
> end
> end
> end
>
> class Class
> def monitored_new(*args, &block)
> AutoMonitor.new(new(*args, &block))
> end
> end
>
>
> Something like this and then you can:
>
> f = Foo.monitored_new
>
> pth