def set_deref_options(opts = {})
      mutex.lock
      @dup_on_deref     = opts[:dup_on_deref]    || opts[:dup]
      @freeze_on_deref  = opts[:freeze_on_deref] || opts[:freeze]
      @copy_on_deref    = opts[:copy_on_deref]   || opts[:copy]
      @nothing_on_deref = !(@dup_on_deref || @freeze_on_deref || @copy_on_deref)
      nil
    ensure
      mutex.unlock
    end
def set_deref_options(opts = {})
      mutex.lock
      @dup_on_deref     = opts[:dup_on_deref]    || opts[:dup]
      @freeze_on_deref  = opts[:freeze_on_deref] || opts[:freeze]
      @copy_on_deref    = opts[:copy_on_deref]   || opts[:copy]
      @nothing_on_deref = !(@dup_on_deref || @freeze_on_deref || @copy_on_deref)
      nil
    ensure
      mutex.unlock
    end
Set the options which define the operations #value performs before
 returning data to the caller (dereferencing).

 @note
   Most classes that include this module will call `#set_deref_options`
   from within the constructor, thus allowing these options to be set at
   object creation.

 @param [Hash] opts
   the options defining dereference behavior.
 @option opts [String] :dup_on_deref (false)
   call `#dup` before returning the data
 @option opts [String] :freeze_on_deref (false)
   call `#freeze` before returning the data
 @option opts [String] :copy_on_deref (nil)
   call the given `Proc` passing the internal value and returning the value
   returned from the proc