   # Short string representation of this packet
   toString: ->
     opcode = ('0000' + @opcode.toString(16).toUpperCase()).slice(-4)
-    return '[' + @constructor.name + '; Opcode: ' + (@opcodeName or 'UNKNOWN') + ' (0x' + opcode + '); Length: ' + @length + '; Index: ' + @_index + ']'
+    return "[#{@constructor.name}; Opcode: #{@opcodeName or 'UNKNOWN'} (0x#{opcode}); Length: #{@length}; Body: #{@bodySize}; Index: #{@_index}]"
 
   # Finalizes this packet
   finalize: ->

    # Whether this packet is outgoing or incoming
    @outgoing = outgoing
    
    # Seek past opcode to reserve space for it when finalizing
    @index = @headerSize

  # Header size in bytes for both incoming and outgoing packets
  @getter 'headerSize', ->
    return @constructor.HEADER_SIZE

  # Retrieves the name of the opcode for this packet (if available)
  @getter 'opcodeName', ->

class WrathNet.net.Packet extends ByteBuffer

  # Creates a new packet with given opcode from given source or length
  constructor: (opcode, source, outgoing=true) ->
    
    # Holds the opcode for this packet
    @opcode = opcode
