docs: function _transform(data, encoding, cb) {
    var res, i = 0, immediate;
    if(this.buffers && (data instanceof Buffer)) {
      this.push(data);
      cb();
    }else{
      // assume you know what you are doing with a raw buffer
      if(Buffer.isBuffer(data) && !this.return_buffers){
        this.push(data);
        cb();
      }else if(this.return_buffers && (data instanceof Buffer)) {
        this.push(_bst(new Buffer(0), data));
        cb();
      }else if(data === undefined
        || data === null
        || Array.isArray(data) && data.length <= this.arrlen
        || (typeof data === 'object' && !Array.isArray(data))
        || typeof data === 'number'
        || (typeof data === 'string' && (data.length < this.strlen))
        || (data instanceof String)) {
        try {
          res = this.value(data);
          //console.dir('' + res);
          this.push(res);
        }catch(e) {
          this.emit('error', e);
          return cb();
        }
        cb();
      // bulk strings broken over ticks
      }else if(typeof data === 'string') {
        // send string length preamble
        res = _len(new Buffer(0), data);
        this.push(res);
        function stringIterator() {
          clearImmediate(immediate);
          var item = data.substr(
            i * this.strlen, (i * this.strlen) + this.strlen);
          if(!item) {
            // send bulk string terminator
            this.push(Constants.ENC.CRLF);
            return cb();
          }
          // send bulk string chunk
          this.push(_bst(new Buffer(0), item, true));
          immediate = setImmediate(stringIterator);
          i++;
        }
        stringIterator = stringIterator.bind(this);
        stringIterator();
      }else if(Array.isArray(data) && data.length > this.arrlen){
        res = _preamble(new Buffer(0), data);
        this.push(res);
        function arrayIterator() {
          clearImmediate(immediate);
          if(i === data.length) return cb();
          var item = data[i];
          this.push(this.value(item));
          immediate = setImmediate(arrayIterator);
          i++;
        }
        arrayIterator = arrayIterator.bind(this);
        arrayIterator();
        //immediate = setImmediate(arrayIterator.bind(this));
      }
    }
  }