*&---------------------------------------------------------------------*
*& Report ZS1_OBSERVER
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZS1_OBSERVER.


CLASS fipostings DEFINITION.
  PUBLIC SECTION.
    METHODS: set_state IMPORTING iv_state TYPE char1.
    EVENTS: state_changed EXPORTING value(new_state) TYPE char1.
  PRIVATE SECTION.
    DATA: current_state TYPE char1.
ENDCLASS.

CLASS fipostings  IMPLEMENTATION.
  METHOD set_state.
    current_state = iv_state.
    SKIP 2.
    WRITE: / 'fi postings', current_state.
    RAISE EVENT state_changed EXPORTING new_state = current_state.
  ENDMETHOD.                    "set_state
ENDCLASS.
CLASS invoice DEFINITION.
  PUBLIC SECTION.
    METHODS: on_state_changed
    FOR EVENT state_changed OF fipostings
      IMPORTING new_state..
ENDCLASS.
*
CLASS invoice IMPLEMENTATION.
  METHOD on_state_changed.
    WRITE: / 'Process invoice postings', new_state.
  ENDMETHOD.                    "on_state_changed
ENDCLASS.
*====
CLASS creditmemo DEFINITION .
  PUBLIC SECTION.
    METHODS: on_state_changed
    FOR EVENT state_changed OF fipostings
      IMPORTING new_state..
ENDCLASS.
*
CLASS creditmemo IMPLEMENTATION.
  METHOD on_state_changed.
    WRITE: / 'process credit memo', new_state.
  ENDMETHOD.                    "on_state_changed
ENDCLASS.                    "mydb IMPLEMENTATION



START-OF-SELECTION.

DATA: fi TYPE REF TO fipostings .
    DATA: inv TYPE REF TO invoice.
    DATA: cmem TYPE REF TO creditmemo.

*   Instantiate the objects
    CREATE OBJECT fi.
    CREATE OBJECT: inv, cmem.

*   Event handlers
    SET HANDLER inv->on_state_changed FOR fi.
    SET HANDLER cmem->on_state_changed FOR fi.

*   Set new state
    fi->set_state( 'A' ).
    fi->set_state( 'B' ).
    fi->set_state( 'C' ).