Events are good way to communicate between objects. They are very useful when the object doesn’t care about the handler of the objects.
What are Events
Events are the message raised by an object. Whenever any condition is met, object can raise an event. E.g. Timer has expired, Cut-off Limit has reached, User Interaction happened etc. This event than can be caught by the receiver. The receiver than implements the logic to handle the event. E.g. When Timer has expired, render the page again; When cut-off limit is reached, tell user to stop etc.
The objects designer doesn’t need to know who would handle the event or not. But it gives an opportunity for any receiver object to catch and process. Its kind of taking a roll call at few intervals in the discussion if anyone of the line has any question. If anyone has the question, they can ask at that time. The receiver object generally doesn’t care how the event was raised. For receiver, it only matters the fact that event was raised and its now trapped in its event handler.
Defining the Events
To define the event, you need to give a meaningful name. You can also declare parameters for the event which can be used to expose the data for the receiver.
CLASS lcl_main DEFINITION. PUBLIC SECTION. EVENTS: cutoff_reached. ENDCLASS. "lcl_main DEFINITION
Raising an event can be done via RAISE EVENT
Raise an Event
RAISE EVENT cutoff_reached.
Handling the Events
First of all you would need to create a receiver object. So, when you declare the method in the receiver class, you define that the method is handler method using FOR EVENT.
Event Handler Definition
CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS: handle_cutoff_reached FOR EVENT cutoff_reached OF lcl_main. ENDCLASS. "lcl_event_handler DEFINITION
If some receiver wants to handle the event, it would need to let the system know about its intension. In ABAP, you can do it via SET HANDLER
Setting up the handler
CREATE OBJECT lo_event_handler. SET HANDLER lo_event_handler->handle_cutoff_reached FOR lo_main.
Check out this Simple example to understand how the events are triggered.
UML is like this for the application:
Sample Event Handling
* CLASS lcl_main DEFINITION. PUBLIC SECTION. DATA: v_num TYPE i. METHODS: process IMPORTING iv_num TYPE i. EVENTS: cutoff_reached. ENDCLASS. "lcl_main DEFINITION * CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS: handle_cutoff_reached FOR EVENT cutoff_reached OF lcl_main. ENDCLASS. "lcl_event_handler DEFINITION * START-OF-SELECTION. DATA: lo_main TYPE REF TO lcl_main. DATA: lo_event_handler TYPE REF TO lcl_event_handler. * CREATE OBJECT lo_main. CREATE OBJECT lo_event_handler. SET HANDLER lo_event_handler->handle_cutoff_reached FOR lo_main. * lo_main->process( 5 ). * CLASS lcl_main IMPLEMENTATION. METHOD process. v_num = iv_num. IF iv_num GE 2. RAISE EVENT cutoff_reached. ENDIF. ENDMETHOD. "process ENDCLASS. "lcl_main IMPLEMENTATION * CLASS lcl_event_handler IMPLEMENTATION. METHOD handle_cutoff_reached. WRITE: 'Event Processed'. ENDMETHOD. "handle_cutoff_reached ENDCLASS. "lcl_event_handler IMPLEMENTATION