1. package body Id_Dispenser is 
  2.  
  3.    protected Dispenser is 
  4.  
  5.       procedure Draw_Id (Id : out Element); 
  6.  
  7.    private 
  8.  
  9.       Max_Id : Element := Element'First; 
  10.  
  11.    end Dispenser; 
  12.  
  13.    protected body Dispenser is 
  14.  
  15.       procedure Draw_Id (Id : out Element) is 
  16.  
  17.       begin 
  18.          Id := Max_Id; 
  19.          Max_Id := Element'Succ (Max_Id); 
  20.       end Draw_Id; 
  21.  
  22.    end Dispenser; 
  23.  
  24.    function Draw_Id return Element is 
  25.  
  26.       Unique_Id : Element := Element'Invalid_Value; 
  27.  
  28.    begin 
  29.       Dispenser.Draw_Id (Id => Unique_Id); 
  30.       return Unique_Id; 
  31.    end Draw_Id; 
  32.  
  33. end Id_Dispenser;