throws Throwable
  public static Value preg_replace_callback(Env env,                                            Value pattern,                                            Callback fun,                                            Value subject,                                            @Optional("-1") long limit,                                            @Optional @Reference Value count)    throws Throwable  {    if (subject instanceof ArrayValue) {      ArrayValue result = new ArrayValueImpl();      for (Value value : ((ArrayValue) subject).values()) {        result.put(pregReplaceCallback(env,                                       pattern,                                       fun,                                       value.toString(),                                       limit,                                       count));      }      return result;    } else if (subject instanceof StringValue) {      return pregReplaceCallback(env,                                 pattern,                                 fun,                                 subject.toString(),                                 limit,                                 count);    } else {      return NullValue.NULL;    }  }