code: func NewStorage(base, temporal storage.Storer) Storage {
  	st := &basic{
  		s:        base,
  		temporal: temporal,
  
  		ObjectStorage:    NewObjectStorage(base, temporal),
  		ReferenceStorage: NewReferenceStorage(base, temporal),
  		IndexStorage:     NewIndexStorage(base, temporal),
  		ShallowStorage:   NewShallowStorage(base, temporal),
  		ConfigStorage:    NewConfigStorage(base, temporal),
  	}
  
  	pw, ok := temporal.(storer.PackfileWriter)
  	if ok {
  		return &packageWriter{
  			basic: st,
  			pw:    pw,
  		}
  	}
  
  	return st
  }
docs: // NewStorage returns a new Storage based on two repositories, base is the base
  // repository where the read operations are read and temporal is were all
  // the write operations are stored.