<Example Program>

Module simple_callback
    Type callback_object
        Character(6) :: id = ''
        Procedure (basic_callback_proc),Pointer :: proc => Null()
    End Type
Contains
    Subroutine basic_callback_proc(me)
        Class(callback_object) me
        If (me%id/='') Then
            Print *,Trim(me%id),' was called'
        Else
            Print *,'Anonymous was called'
        End If
    End Subroutine
    Subroutine stop_program_callback_proc(me)
        Class(callback_object) me
        If (me%id/='') Then
            Print *,'Stop requested by ',me%id
        Else
            Print *,'Anonymous stop request'
        End If
        Stop 'Program stopped by callback'
    End Subroutine
    Subroutine process(cba)
        Class(callback_object) cba(:)
        Do i=1,Size(cba)
            If (Associated(cba(i)%proc)) Then
                Call cba(i)%proc
            Else If (cba(i)%id/='') Then
                Print *,'No action for ',cba(i)%id
            Else
                Print *,'No action for anonymous item',i
            End If
        End Do
    End Subroutine
End Module

Program example
    Use simple_callback
    Type(callback_object) x(5)
    x(1) = callback_object('X1',basic_callback_proc)
    x(2)%proc => basic_callback_proc

    x(3)%id = 'Noone'
    x(5)%id = 'End!'
    x(5)%proc => stop_program_callback_proc
    Call process(x)
End Program

Execution Results

X1 was called
Anonymous was called
No action for Noone
No action for anonymous item 4
Stop requested by End!
STOP: Program stopped by callback