code: func (c *cachedDownloader) populateCache(
  	logger lager.Logger,
  	url *url.URL,
  	name string,
  	cachingInfo CachingInfoType,
  	checksum ChecksumInfoType,
  	transformer CacheTransformer,
  	cancelChan <-chan struct{},
  ) (download, bool, int64, error) {
  	filename, cachingInfo, err := c.downloader.Download(logger, url, func() (*os.File, error) {
  		return ioutil.TempFile(c.uncachedPath, name+"-")
  	}, cachingInfo, checksum, cancelChan)
  	if err != nil {
  		return download{}, false, 0, err
  	}
  
  	if filename == "" {
  		return download{}, true, 0, nil
  	}
  
  	fileInfo, err := os.Stat(filename)
  	if err != nil {
  		return download{}, false, 0, err
  	}
  	defer os.Remove(filename)
  
  	cachedFile, err := ioutil.TempFile(c.uncachedPath, "transformed")
  	if err != nil {
  		return download{}, false, 0, err
  	}
  
  	err = cachedFile.Close()
  	if err != nil {
  		return download{}, false, 0, err
  	}
  
  	cachedSize, err := transformer(filename, cachedFile.Name())
  	if err != nil {
  		return download{}, false, 0, err
  	}
  
  	return download{
  		path:        cachedFile.Name(),
  		size:        cachedSize,
  		cachingInfo: cachingInfo,
  	}, false, fileInfo.Size(), nil
  }
docs: // Currently populateCache takes a transformer due to the fact that a fetchCachedDirectory
  // uses only a TarTransformer, which overwrites what is currently set. This way one transformer
  // can be used to call Fetch and FetchAsDirectory