private function parseField()
    {
        $type = $this->buffer[0];
        $this->buffer = substr($this->buffer, 1);

        // @todo bench switch vs if vs method map
        switch ($type) {
            case 's':
                return $this->parseSignedInt16();
            case 'l':
                return $this->parseSignedInt64();
            case 'x':
                return $this->parseByteArray();
            case 't':
                return $this->parseUnsignedInt8() !== 0;
            case 'b':
                return $this->parseSignedInt8();
            case 'I':
                return $this->parseSignedInt32();
            case 'f':
                return $this->parseFloat();
            case 'd':
                return $this->parseDouble();
            case 'D':
                return $this->parseDecimal();
            case 'S':
                return $this->parseLongString();
            case 'A':
                return $this->parseArray();
            case 'T':
                return $this->parseUnsignedInt64();
            case 'F':
                return $this->parseTable();
            case 'V':
                return null;
        }

        throw new AMQPProtocolException(
            sprintf(
                'table value type (0x%02x) is invalid or unrecognised.',
                ord($type)
            )
        );
    }