1. with Keyboard;                          use Keyboard; 
  2. with Objects;                           use Objects; 
  3. with Worlds;                            use Worlds; 
  4.  
  5. package Tools is 
  6.  
  7.     type Function_Type is ( Primary, Secondary, Tertiary ); 
  8.  
  9.     type Tool is abstract new Object with private; 
  10.     type A_Tool is access all Tool'Class; 
  11.  
  12.     procedure Apply( this      : access Tool; 
  13.                      func      : Function_Type; 
  14.                      modifiers : Modifiers_Array; 
  15.                      first     : Boolean; 
  16.                      world     : not null A_World; 
  17.                      worldX, 
  18.                      worldY, 
  19.                      layer     : Integer ) is abstract; 
  20.  
  21.     function Copy( src : A_Tool ) return A_Tool; 
  22.     pragma Postcondition( Copy'Result /= src or else src = null ); 
  23.  
  24.     -- Deletes the Tool. 
  25.     procedure Delete( this : in out A_Tool ); 
  26.  
  27. private 
  28.  
  29.     type Tool is abstract new Object with null record; 
  30.  
  31. end Tools;