code: func (n *EvalCountFixZeroOneBoundaryGlobal) Eval(ctx EvalContext) (interface{}, error) {
  	// We'll temporarily lock the state to grab the modules, then work on each
  	// one separately while taking a lock again for each separate resource.
  	// This means that if another caller concurrently adds a module here while
  	// we're working then we won't update it, but that's no worse than the
  	// concurrent writer blocking for our entire fixup process and _then_
  	// adding a new module, and in practice the graph node associated with
  	// this eval depends on everything else in the graph anyway, so there
  	// should not be concurrent writers.
  	state := ctx.State().Lock()
  	moduleAddrs := make([]addrs.ModuleInstance, 0, len(state.Modules))
  	for _, m := range state.Modules {
  		moduleAddrs = append(moduleAddrs, m.Addr)
  	}
  	ctx.State().Unlock()
  
  	for _, addr := range moduleAddrs {
  		cfg := n.Config.DescendentForInstance(addr)
  		if cfg == nil {
  			log.Printf("[WARN] Not fixing up EachModes for %s because it has no config", addr)
  			continue
  		}
  		if err := n.fixModule(ctx, addr); err != nil {
  			return nil, err
  		}
  	}
  
  	return nil, nil
  }
docs: // TODO: test