class Concurrent::Collection::CopyOnWriteObserverSet

def add_observer(observer = nil, func = :update, &block)

@!macro observable_add_observer
def add_observer(observer = nil, func = :update, &block)
  if observer.nil? && block.nil?
    raise ArgumentError, 'should pass observer as a first argument or block'
  elsif observer && block
    raise ArgumentError.new('cannot provide both an observer and a block')
  end
  if block
    observer = block
    func = :call
  end
  synchronize do
    new_observers = @observers.dup
    new_observers[observer] = func
    @observers = new_observers
    observer
  end
end