code: func (c *Cache) GetOrCreate(id string, create func() (io.ReadCloser, error)) (ItemInfo, io.ReadCloser, error) {
  	id = cleanID(id)
  
  	c.nlocker.Lock(id)
  	defer c.nlocker.Unlock(id)
  
  	info := ItemInfo{Name: id}
  
  	if r := c.getOrRemove(id); r != nil {
  		return info, r, nil
  	}
  
  	r, err := create()
  	if err != nil {
  		return info, nil, err
  	}
  
  	if c.maxAge == 0 {
  		// No caching.
  		return info, hugio.ToReadCloser(r), nil
  	}
  
  	var buff bytes.Buffer
  	return info,
  		hugio.ToReadCloser(&buff),
  		afero.WriteReader(c.Fs, id, io.TeeReader(r, &buff))
  }
docs: // GetOrCreate tries to get the file with the given id from cache. If not found or expired, create will
  // be invoked and the result cached.
  // This method is protected by a named lock using the given id as identifier.