         # If we are filling an array field the current fields is an array,
         # otherwise current field is the value we've just read.
         if @pattern[@patternIndex].arrayed
-          @fields[@fields.length - 1].push(field) if field?
+          @_fields[@_fields.length - 1].push(field) if field?
         else
-          @fields.push(field)
+          @_fields.push(field)
 
 
       # If we've not yet hit our terminator, check for the terminator. If we've


  packet: (name, pattern, callback) ->
    super name, pattern, callback
    for part in @packets[name].pattern
      if part.transforms
        part.transforms.reverse()


      # The pattern is set to null, our terminal condition, because the callback
      # may specify a subsequent packet to parse.
      else if ++@patternIndex == @pattern.length
        @_fields.push(@pipeline(@pattern[@patternIndex - 1 ], @_fields.pop()))

        @_fields.push(this)
        for p in @user or []
          @_fields.push(p)

        @pattern = null

        @callback.apply @self, @_fields

      # Otherwise we proceed to the next field in the packet pattern.
      else
        if @pattern[@patternIndex - 1].endianness isnt "x"
          if @pattern[@patternIndex - 1].length
            @pattern[@patternIndex].repeat = @_fields.pop()
          else
            @_fields.push(@pipeline(@pattern[@patternIndex - 1], @_fields.pop()))

        @nextField()
        @nextValue()
