# Synchronize access around a method, delegating synchronization to a
# particular mutex. A mutex (either a Mutex, or any object that responds to
# #synchronize and yields to a block) must be provided as a final :with option.
# The :with option should be a symbol or string, and can represent a method,
# constant, or instance or class variable.
# Example:
# class SharedCache
# @@lock = Mutex.new
# def expire
# ...
# end
# synchronize :expire, :with => :@@lock
# end
defsynchronize(*methods)
options=methods.extract_options!
unlessoptions.is_a?(Hash)&&with=options[:with]
raiseArgumentError,"Synchronization needs a mutex. Supply an options hash with a :with key as the last argument (e.g. synchronize :hello, :with => :@mutex)."