    # File lib/amqp/channel.rb, line 204
        def initialize(connection = nil, id = self.class.next_channel_id, options = {}, &block)
          raise 'AMQP can only be used from within EM.run {}' unless EM.reactor_running?

          @connection = connection || AMQP.connection || AMQP.start
          # this means 2nd argument is options
          if id.kind_of?(Hash)
            options = options.merge(id)
            id      = self.class.next_channel_id
          end

          super(@connection, id, options)

          @rpcs                       = Hash.new
          # we need this deferrable to mimic what AMQP gem 0.7 does to enable
          # the following (pseudo-synchronous) style of programming some people use in their
          # existing codebases:
          #
          # connection = AMQP.connect
          # channel    = AMQP::Channel.new(connection)
          # queue      = AMQP::Queue.new(channel)
          #
          # ...
          #
          # Read more about EM::Deferrable#callback behavior in EventMachine documentation. MK.
          @channel_is_open_deferrable = AMQ::Client::EventMachineClient::Deferrable.new

          # only send channel.open when connection is actually open. Makes it possible to
          # do c = AMQP.connect; AMQP::Channel.new(c) that is what some people do. MK.
          @connection.on_connection do
            self.open do |ch, open_ok|
              @channel_is_open_deferrable.succeed

              if block
                case block.arity
                when 1 then block.call(ch)
                else block.call(ch, open_ok)
                end # case
              end # if

              self.prefetch(options[:prefetch], false) if options[:prefetch]
            end # self.open
          end # @connection.on_open
        end