code: public SmartBinder foldVirtual(String newName, Lookup lookup, String method) {
          Binder newBinder = binder.foldVirtual(lookup, method);
          return new SmartBinder(this, signature().prependArg(newName, newBinder.type().parameterType(0)), newBinder);
      }
docs: Acquire a virtual folding function from the first argument's class,
  using the given name and Lookup. Pass all arguments to that function and
  insert the resulting value as newName into the argument list.
  
  @param newName the name of the new first argument where the fold
  function's result will be passed
  @param lookup  the Lookup to use for acquiring a folding function
  @param method  the name of the method to become a folding function
  @return a new SmartBinder with the fold applied