docs: function install(thorin, item, done) {
    let calls = [];
    let config = item.opt.releaser,
      url = `${API}/services/download?token=` + config.token,
      zipPath,
      folderPath = path.normalize(`${thorin.root}/node_modules/thorin-module-${item.name}`);
    let filePath = folderPath + '.zip',
      result = {
        path: folderPath
      };
  
    /* Step one: download from Releaser if we have a releaser config */
    calls.push((fn) => {
      console.log(`Thorin: downloading module ${item.name} to ${folderPath}`);
      download(url, {
        path: folderPath
      }, fn);
    });
  
    /* Next, we have to unzip the file */
    calls.push((fn) => {
      fse.ensureDir(folderPath, fn);
    });
  
    /* Next, we have to install archiver */
    calls.push((fn) => {
      console.log(`Thorin: installing ${DEPS.join(', ')}`);
      let cmd = `npm i -p ${DEPS.join(' ')}`,
        opt = {
          cwd: thorin.root
        };
      exec(cmd, opt, (err, res) => {
        if (err) return fn(err);
        fn();
      });
    });
  
    /* Next, unzip it */
    calls.push(async (fn) => {
      console.log(`Thorin: unzipping to: ${folderPath}`);
      const unzip2 = require(path.normalize(thorin.root + `/node_modules/unzip2`));
      unzip(unzip2, filePath, folderPath, fn);
    });
  
    /* Finally, install its dependencies */
    calls.push((fn) => {
      console.log(`Thorin: installing module dependencies`);
      let cmd = `npm i -p`;
      exec(cmd, {
        cwd: folderPath
      }, fn);
    });
  
    /* Cleanup */
    calls.push((fn) => {
      fs.unlink(filePath, (e) => {
        if (e) {
          console.log(`Thorin: failed to remove module ${filePath}`);
          console.log(e);
        }
        fn();
      });
    });
  
    async.series(calls, (e) => {
      if (e) return done(e);
      done(null, result);
    });
  }