docs: public static synchronized CurrencyUnit registerCurrency(
                      String currencyCode, int numericCurrencyCode, int decimalPlaces, List<String> countryCodes, boolean force) {
          MoneyUtils.checkNotNull(currencyCode, "Currency code must not be null");
          if (currencyCode.length() != 3) {
              throw new IllegalArgumentException("Invalid string code, must be length 3");
          }
          if (CODE.matcher(currencyCode).matches() == false) {
              throw new IllegalArgumentException("Invalid string code, must be ASCII upper-case letters");
          }
          if (numericCurrencyCode < -1 || numericCurrencyCode > 999) {
              throw new IllegalArgumentException("Invalid numeric code");
          }
          if (decimalPlaces < -1 || decimalPlaces > 30) {
              throw new IllegalArgumentException("Invalid number of decimal places");
          }
          MoneyUtils.checkNotNull(countryCodes, "Country codes must not be null");
          
          CurrencyUnit currency = new CurrencyUnit(currencyCode, (short) numericCurrencyCode, (short) decimalPlaces);
          if (force) {
              currenciesByCode.remove(currencyCode);
              currenciesByNumericCode.remove(numericCurrencyCode);
              for (String countryCode : countryCodes) {
                  currenciesByCountry.remove(countryCode);
              }
          } else {
              if (currenciesByCode.containsKey(currencyCode) || currenciesByNumericCode.containsKey(numericCurrencyCode)) {
                  throw new IllegalArgumentException("Currency already registered: " + currencyCode);
              }
              for (String countryCode : countryCodes) {
                  if (currenciesByCountry.containsKey(countryCode)) {
                      throw new IllegalArgumentException("Currency already registered for country: " + countryCode);
                  }
              }
          }
          currenciesByCode.putIfAbsent(currencyCode, currency);
          if (numericCurrencyCode >= 0) {
              currenciesByNumericCode.putIfAbsent(numericCurrencyCode, currency);
          }
          for (String countryCode : countryCodes) {
              registerCountry(countryCode, currency);
          }
          return currenciesByCode.get(currencyCode);
      }