docs: public static String replaceAll(String source, Pattern pattern, Handler<String, String> handler)
    {
      Matcher matcher = pattern.matcher(source);
      StringBuilder builder = new StringBuilder();
      int start = 0;
      while(matcher.find(start)) {
        builder.append(source.substring(start, matcher.start()));
        if(matcher.groupCount() == 0) {
          builder.append(handler.handle(source.substring(matcher.start(), matcher.end())));
        }
        else {
          for(int i = 0; i < matcher.groupCount(); ++i) {
            builder.append(handler.handle(matcher.group(i + 1)));
          }
        }
        start = matcher.end();
      }
      builder.append(source.substring(start));
      return builder.toString();
    }