code: func Model(name string, opts map[string]interface{}, attributes []string) error {
  	if strings.TrimSpace(name) == "" {
  		return errors.New("model name can't be empty")
  	}
  	mt, found := opts["marshalType"].(string)
  	if !found {
  		return errors.New("marshalType option is required")
  	}
  
  	pp, found := opts["modelPath"].(string)
  	if !found {
  		return errors.New("modelPath option is required")
  	}
  
  	model, err := newModel(name, mt, pp)
  	if err != nil {
  		return errors.WithStack(err)
  	}
  
  	for _, def := range attributes {
  		a, err := newAttribute(def, &model)
  		if err != nil {
  			return err
  		}
  		if err := model.addAttribute(a); err != nil {
  			return err
  		}
  	}
  
  	// Add a default UUID, if no custom ID is provided
  	model.addID()
  
  	if err := model.generateModelFile(); err != nil {
  		return err
  	}
  
  	sm, found := opts["skipMigration"].(bool)
  	if found && sm {
  		return nil
  	}
  
  	p, found := opts["path"].(string)
  	if !found {
  		return errors.New("path option is required")
  	}
  
  	migrationT, found := opts["migrationType"].(string)
  	if !found {
  		return errors.New("migrationType option is required")
  	}
  	switch migrationT {
  	case "sql":
  		env, found := opts["env"].(string)
  		if !found {
  			return errors.New("env option is required")
  		}
  		err = model.generateSQL(p, env)
  	default:
  		err = model.generateFizz(p)
  	}
  	return err
  }
docs: // Model generates new model files to work with pop.