protected static Object checkMaterials(
    Holding holding, int upgradeLevel, boolean verbose
  ) {
    final Conversion materials = materials(upgradeLevel) ;
    
    for (Item needed : materials.raw) {
      if (holding.stocks.amountOf(needed) < needed.amount - 0.5f) {
        if (! verbose) return NOT_MET ;
        if (upgradeLevel > holding.upgradeLevel()) return
          "This holding needs more "+needed.type+" before further development "+
          "can proceed." ;
        else return
          "This holding is short of "+needed.type+", needed for maintenance "+
          "and repairs." ;
      }
    }
    return NEEDS_MET ;
  }