Спасибо! Как раз то, что нужно.

## Код:
```
MODULE TmpM3;

   IMPORT SYSTEM;

   TYPE
      Msg* = ABSTRACT RECORD END;
      MsgHandler* = POINTER TO ABSTRACT RECORD END;
      Table* = POINTER TO ABSTRACT RECORD END;

   PROCEDURE (h: MsgHandler) Handle- (IN msg: Msg), NEW, ABSTRACT;

   PROCEDURE (t: Table) Lookup- (id: BYTE; OUT len: BYTE; OUT type: INTEGER; OUT ok: BOOLEAN), NEW, ABSTRACT;

   PROCEDURE DataReceived* (id: BYTE; IN a: ARRAY OF BYTE; len: BYTE; h: MsgHandler; table: Table);
      VAR type: INTEGER; len1: BYTE; ok: BOOLEAN;
   BEGIN
      table.Lookup(id, len1, type, ok);
      IF ok & (len = len1) THEN
         h.Handle( SYSTEM.THISRECORD( SYSTEM.ADR(a), type ) )
      END
   END DataReceived;

END TmpM3.
```
