Question on response_handler arguments

Hi,
I have a question on response_handler virtual function arguments. According to the UVM reference, response_handler is a virtual function which is called by sequencer whenever there is a response item in response fifo and it keeps response fifo empty.
The argument to the response_handler function is response which is of the type uvm_sequence_item. It is an input argument.
Since response_handler automatically gets called (when it is enabled by use_response_handler(1)) keeping response fifo in sequencer empty, does response_handler read the response from response_fifo. In that case it should return the response and response argument should be output or reference.
I am not clear about this. Can someone explain please.
regards,
-sunil puranik

You asked a similar question before.

The uvm_sequence response_handler() work like the the uvm_subscriber write() method. (It is too bad the UVM committee did not use the same name so would would be exactly like the write() method). Both get called with an input argument that has a handle to a transaction constructed in the driver or monitor. The sequence provides the “implementation” of the response_handler() method and reads the information it needs out of the transaction that was passed to it.

Thanks Dave for the explanation.
I have another related question - The response_handler() does not read the response from response_fifo in sequencer but is called by sequencer with handle to the response. In that case how is the response read from response_fifo. Do we still have to call get_response in sequence?
The example given on page 249-250 of UVM “cookbook verification academy” does not call get_response in sequence. It implements only response_handler virtual function in sequence and start_item/finish_item. In that case does the sequencer itself read from response_fifo and pass the response to response_handler if the response_handler is enabled with use_response_handler(1).
regards,
-sunil