		ApplyRunner(
			ReferenceHandle& that,
			MaybeLocal<Value> recv_handle,
			Maybe<ArrayRange> maybe_arguments,
			MaybeLocal<Object> maybe_options
		) :	context{that.context}, reference{that.reference}
		{
			that.CheckDisposed();

			// Get receiver, holder, this, whatever
			Local<Value> recv_local;
			if (recv_handle.ToLocal(&recv_local)) {
				recv = TransferOut(recv_local);
			}

			// Get run options
			TransferOptions arguments_transfer_options;
			Local<Object> options;
			if (maybe_options.ToLocal(&options)) {
				timeout = ReadOption<int32_t>(options, StringTable::Get().timeout, 0);
				arguments_transfer_options = TransferOptions{
					ReadOption<MaybeLocal<Object>>(options, StringTable::Get().arguments, {})};
				return_transfer_options = TransferOptions{
					ReadOption<MaybeLocal<Object>>(options, StringTable::Get().result, {}),
					TransferOptions::Type::Reference};
			}

			// Externalize all arguments
			ArrayRange arguments;
			if (maybe_arguments.To(&arguments)) {
				argv.reserve(std::distance(arguments.begin(), arguments.end()));
				for (auto argument : arguments) {
					argv.push_back(TransferOut(argument, arguments_transfer_options));
				}
			}
		}
		ApplyRunner(
			ReferenceHandle& that,
			MaybeLocal<Value> recv_handle,
			Maybe<ArrayRange> maybe_arguments,
			MaybeLocal<Object> maybe_options
		) :	context{that.context}, reference{that.reference}
		{
			that.CheckDisposed();

			 
			Local<Value> recv_local;
			if (recv_handle.ToLocal(&recv_local)) {
				recv = TransferOut(recv_local);
			}

			 
			TransferOptions arguments_transfer_options;
			Local<Object> options;
			if (maybe_options.ToLocal(&options)) {
				timeout = ReadOption<int32_t>(options, StringTable::Get().timeout, 0);
				arguments_transfer_options = TransferOptions{
					ReadOption<MaybeLocal<Object>>(options, StringTable::Get().arguments, {})};
				return_transfer_options = TransferOptions{
					ReadOption<MaybeLocal<Object>>(options, StringTable::Get().result, {}),
					TransferOptions::Type::Reference};
			}

			 
			ArrayRange arguments;
			if (maybe_arguments.To(&arguments)) {
				argv.reserve(std::distance(arguments.begin(), arguments.end()));
				for (auto argument : arguments) {
					argv.push_back(TransferOut(argument, arguments_transfer_options));
				}
			}
		}