docs: function extract_to(_path, jszip, callback) {
  
      var extraction_path = _path === null ? "./" : path.normalize(_path);
      if(extraction_path[extraction_path.length - 1] !== path.sep) {
          extraction_path += path.sep;
      }
  
      // make sure that the extraction path points to a existing directory
      fs.stat(extraction_path, function (err, stats) {
  
          if (err) {
              callback(err);
              return;
          }
  
          if (!stats.isDirectory()) {
              callback(new Error(extraction_path + " is not a directory"));
              return;
          }
  
          // sort out the unzipped file to directories and files
          var dirs = [];
          var files = [];
          for (var name in jszip.files) {
  
              var entry = jszip.files[name];
  
              if (entry.dir)
                  dirs.push(name);
              else
                  files.push(name);
          }
  
          // sort the directories ascendingy by level
          dirs.sort(function (a, b) {
              function dir_sep_count(dir) { return (dir.match(/\//g) || []).length; }
  
              return dir_sep_count(a) - dir_sep_count(b);
          });
  
  
          // create the directories
          async.eachSeries(dirs, function (dir, end_iteration) {
  
              //check first if the directory exists
              fs.stat(extraction_path + dir, function(err, stats) {
                  if((err && err.code === "ENOENT") || !stats.isDirectory()) {
                      // create the directory if it doesn't exist
                      fs.mkdir(extraction_path + dir, function (err) {
                          // end of this iteration
                          if(err) {
                              end_iteration(err);
                              return;
                          }
                          end_iteration();
                      });
                  }
                  else if(err && err.code !== "ENOENT") {
                      end_iteration(err);
                      return;
                  }
                  else {
                      end_iteration();
                  }
              });
  
          }, function (err) {
  
              if (err) {
                  callback(err);
                  return;
              }
  
              // write the files
              async.each(files, function (file, end_iteration) {
  
                  var data = jszip.file(file).asNodeBuffer();
  
                  fs.writeFile(extraction_path + file, data, function (err) {
  
                      if (err) {
                          end_iteration(err);
                          return;
                      }
  
                      // end of this iteration
                      end_iteration();
  
                  });
              }, function (err) {
  
                  if(err) {
                      callback(err);
                      return;
                  }
  
                  // invoke the callback
                  callback(null);
              });
          });
      });
  }