Read the next method from the source, once one complete method has
        been assembled it is placed in the internal queue.

def _next_method(self):
        """Read the next method from the source, once one complete method has
        been assembled it is placed in the internal queue."""
        queue = self.queue
        put = self._quick_put
        read_frame = self.source.read_frame
        while not queue:
            try:
                frame_type, channel, payload = read_frame()
            except Exception as exc:
                #
                # Connection was closed?  Framing Error?
                #
                put(exc)
                break

            self.bytes_recv += 1

            if frame_type not in (self.expected_types[channel], 8):
                put((
                    channel,
                    UnexpectedFrame(
                        'Received frame {0} while expecting type: {1}'.format(
                            frame_type, self.expected_types[channel]))))
            elif frame_type == 1:
                self._process_method_frame(channel, payload)
            elif frame_type == 2:
                self._process_content_header(channel, payload)
            elif frame_type == 3:
                self._process_content_body(channel, payload)
            elif frame_type == 8:
                self._process_heartbeat(channel, payload)