code: func Run() error {
  	if len(roots) == 0 {
  		return nil
  	}
  	roots, err := SortRoots()
  	if err != nil {
  		return err
  	}
  	Errors = nil
  	executed := 0
  	recursed := 0
  	for executed < len(roots) {
  		recursed++
  		start := executed
  		executed = len(roots)
  		for _, root := range roots[start:] {
  			root.IterateSets(runSet)
  		}
  		if recursed > 100 {
  			// Let's cross that bridge once we get there
  			return fmt.Errorf("too many generated roots, infinite loop?")
  		}
  	}
  	if Errors != nil {
  		return Errors
  	}
  	for _, root := range roots {
  		root.IterateSets(validateSet)
  	}
  	if Errors != nil {
  		return Errors
  	}
  	for _, root := range roots {
  		root.IterateSets(finalizeSet)
  	}
  
  	return nil
  }
docs: // Run runs the given root definitions. It iterates over the definition sets
  // multiple times to first execute the DSL, the validate the resulting
  // definitions and finally finalize them. The executed DSL may register new
  // roots to have them be executed (last) in the same run.