code: @FromString
      public static BigMoney parse(String moneyStr) {
          MoneyUtils.checkNotNull(moneyStr, "Money must not be null");
          if (moneyStr.length() < 4) {
              throw new IllegalArgumentException("Money '" + moneyStr + "' cannot be parsed");
          }
          String currStr = moneyStr.substring(0, 3);
          int amountStart = 3;
          while (amountStart < moneyStr.length() && moneyStr.charAt(amountStart) == ' ') {
              amountStart++;
          }
          String amountStr = moneyStr.substring(amountStart);
          if (PARSE_REGEX.matcher(amountStr).matches() == false) {
              throw new IllegalArgumentException("Money amount '" + moneyStr + "' cannot be parsed");
          }
          return BigMoney.of(CurrencyUnit.of(currStr), new BigDecimal(amountStr));
      }
docs: Parses an instance of {@code BigMoney} from a string.
  <p>
  The string format is '$currencyCode $amount' where there may be
  zero to many spaces between the two parts.
  The currency code must be a valid three letter currency.
  The amount must match the regular expression {@code [+-]?[0-9]*[.]?[0-9]*}.
  The spaces and numbers must be ASCII characters.
  This matches the output from {@link #toString()}.
  <p>
  For example, {@code parse("USD 25")} creates the instance {@code USD 25}
  while {@code parse("USD 25.95")} creates the instance {@code USD 25.95}.
  
  @param moneyStr  the money string to parse, not null
  @return the parsed instance, never null
  @throws IllegalArgumentException if the string is malformed
  @throws ArithmeticException if the amount is too large