    # File lib/amqp/queue.rb, line 173
        def initialize(channel, name = AMQ::Protocol::EMPTY_STRING, opts = {}, &block)
          raise ArgumentError.new("queue name must not be nil; if you want broker to generate queue name for you, pass an empty string") if name.nil?

          @channel  = channel
          @name     = name unless name.empty?
          @server_named = name.empty?
          @opts         = self.class.add_default_options(name, opts, block)

          raise ArgumentError.new("server-named queues (name = '') declaration with :nowait => true makes no sense. If you are not sure what that means, simply drop :nowait => true from opts.") if @server_named && @opts[:nowait]

          # a deferrable that we use to delay operations until this queue is actually declared.
          # one reason for this is to support a case when a server-named queue is immediately bound.
          # it's crazy, but 0.7.x supports it, so... MK.
          @declaration_deferrable = AMQ::Client::EventMachineClient::Deferrable.new

          if @opts[:nowait]
            @status = :opened
            block.call(self) if block
          else
            @status = :opening
          end

          super(channel.connection, channel, name)

          shim = Proc.new do |q, declare_ok|
            @declaration_deferrable.succeed

            case block.arity
            when 1 then block.call(q)
            else
              block.call(q, declare_ok)
            end
          end

          @channel.once_open do
            if block
              self.declare(@opts[:passive], @opts[:durable], @opts[:exclusive], @opts[:auto_delete], @opts[:nowait], @opts[:arguments], &shim)
            else
              injected_callback = Proc.new { @declaration_deferrable.succeed }
              # we cannot pass :nowait as true here, AMQ::Client::Queue will (rightfully) raise an exception because
              # it has no idea about crazy edge cases we are trying to support for sake of backwards compatibility. MK.
              self.declare(@opts[:passive], @opts[:durable], @opts[:exclusive], @opts[:auto_delete], false, @opts[:arguments], &injected_callback)
            end
          end
        end