code: public static synchronized CurrencyUnit registerCurrency(
              String currencyCode, int numericCurrencyCode, int decimalPlaces, List<String> countryCodes) {
          return registerCurrency(currencyCode, numericCurrencyCode, decimalPlaces, countryCodes, false);
      }
docs: Registers a currency and associated countries allowing it to be used.
  <p>
  This class only permits known currencies to be returned.
  To achieve this, all currencies have to be registered in advance.
  <p>
  Since this method is public, it is possible to add currencies in
  application code. It is recommended to do this only at startup, however
  it is safe to do so later as the internal implementation is thread-safe.
  <p>
  The currency code must be three upper-case ASCII letters, based on ISO-4217.
  The numeric code must be from 0 to 999, or -1 if not applicable.
  
  @param currencyCode  the three-letter upper-case currency code, not null
  @param numericCurrencyCode  the numeric currency code, from 0 to 999, -1 if none
  @param decimalPlaces  the number of decimal places that the currency
  normally has, from 0 to 30 (normally 0, 2 or 3), or -1 for a pseudo-currency
  @param countryCodes  the country codes to register the currency under, not null
  @return the new instance, never null
  @throws IllegalArgumentException if the code is already registered, or the
  specified data is invalid