#### 8.1.4.3 Remote Access to Subprograms (RAS)

In the following example, several mirroring banks offer their services through the same database. Each bank registers a reference to each of its services with a central bank. A client of the central bank requests a service from one of the mirroring banks. To satisfy requests, the RCI unit RASBank defines Balance_Type, a remote access to subprogram. (Recall that an access type declared in a remote unit has to be either remote access to subprogram or remote access to class wide type).

Note that to obtain a remote access to subprogram, the subprogram that delivers the remote access must be remote itself. Therefore, MirrorBank is a RCI library unit.

    with Types; use Types;
    package RASBank is
       pragma Remote_Call_Interface;

       type Balance_Type is access function
         (Customer : in Customer_Type;
          Password : in Password_Type)
          return Integer;

       procedure Register
          (Balance : in Balance_Type);

       function Get_Balance
          return Balance_Type;

       --  [...] Other services
    end RASBank;

In the code below, a mirroring bank registers its services to the central bank.

    with Types; use Types;
    package MirrorBank is
       pragma Remote_Call_Interface;

       function Balance
         (Customer : in Customer_Type;
          Password : in Password_Type)
          return Integer;

       --  [...] Other services
    end MirrorBank;

    with RASBank, Types; use RASBank, Types;
    package body MirrorBank is

       function Balance
         (Customer : in Customer_Type;
          Password : in Password_Type)
          return Integer is
       begin
          return Something;
       end Balance;

    begin
       --  Register a dynamically bound remote subprogram (Balance)
       --  through a statically bound remote subprogram (Register)
       Register (Balance'Access);
       --  [...] Register other services
    end MirrorBank;

In the code below, a central bank client asks for a mirroring bank and calls the Balance service of this bank by dereferencing a remote access type.

    with Types; use Types;
    with RASBank; use RASBank;
    procedure BankClient is
       B : Integer;
       C : Customer_Type := "rich";
       P : Password_Type := "xxxx";
    begin
       --  Through a statically bound remote subprogram (Get_Balance), get
       --  a dynamically bound remote subprogram. Dereference it to
       --  perform a dynamic invocation.
       B := Get_Balance.all (C, P);
    end BankClient;