code: func NewProjectionFromFolder(specFileOrDirs ...string) (*Projection, error) {
  	eventSpec := types.EventSpec{}
  
  	const errHeader = "NewProjectionFromFolder():"
  
  	for _, dir := range specFileOrDirs {
  		err := filepath.Walk(dir, func(path string, _ os.FileInfo, err error) error {
  			if err != nil {
  				return fmt.Errorf("error walking event spec files location '%s': %v", dir, err)
  			}
  			if filepath.Ext(path) == ".json" {
  				bs, err := readFile(path)
  				if err != nil {
  					return fmt.Errorf("error reading spec file '%s': %v", path, err)
  				}
  
  				err = ValidateJSONEventSpec(bs)
  				if err != nil {
  					return fmt.Errorf("could not validate spec file '%s': %v", path, err)
  				}
  
  				fileEventSpec := types.EventSpec{}
  				err = json.Unmarshal(bs, &fileEventSpec)
  				if err != nil {
  					return fmt.Errorf("error reading spec file '%s': %v", path, err)
  				}
  
  				eventSpec = append(eventSpec, fileEventSpec...)
  			}
  
  			return nil
  		})
  		if err != nil {
  			return nil, fmt.Errorf("%s %v", errHeader, err)
  		}
  	}
  
  	return NewProjectionFromEventSpec(eventSpec)
  }
docs: // NewProjectionFromFolder creates a Projection from a folder containing spec files