docs: @JRubyMethod(required = 1, optional = 1)
      public static IRubyObject load(IRubyObject self, IRubyObject[] args) {
          Ruby runtime = self.getRuntime();
          ThreadContext ctx = runtime.getCurrentContext();
          IRubyObject port = args[0];
          IRubyObject proc = null;
          if(args.length > 1) {
              proc = args[1];
          } else {
              proc = runtime.getNil();
          }
  
          IRubyObject input = ((RubyHash)self.callMethod(ctx, "options")).op_aref(ctx, runtime.newSymbol("input"));
          IRubyObject model = ((RubyHash)self.callMethod(ctx, "options")).op_aref(ctx, runtime.newSymbol("Model"));
  
          Parser parser = (Parser)self.dataGetStructChecked();
          setModel(self, input, model);
              
          Extra bonus = (Extra)parser.bonus;
          bonus.taint = assignIO(runtime, parser, new IRubyObject[]{port});
          parser.setRootOnError(runtime.getNil());
          bonus.data = RubyHash.newHash(runtime);
          bonus.resolver = self.callMethod(ctx, "resolver");
          //             System.err.println("Parser resolver is : " + bonus.resolver);
          if(proc.isNil()) {
              bonus.proc = null;
          } else {
              bonus.proc = proc;
          }
  
          IRubyObject result = (IRubyObject)parser.parse();
  
          if(result == null) {
              result = runtime.getFalse();
          }
  
          return result;
      }