with Ada.Finalization;
package task_name is
   type Base_Controller is
     abstract new Ada.Finalization.Limited_Controlled with null record;

   type Extended_Controller is
     abstract new Base_Controller with private;

   type Task_Object (Controller : access Extended_Controller'Class) is
     limited private;
private
   type String_Access is access string;

   type Extended_Controller is
     abstract new Base_Controller with record
        Thread : aliased Task_Object (Extended_Controller'Access);
        Name   : String_Access := new string'("the_name_of_the_task");
     end record;

   task type Task_Object (Controller : access Extended_Controller'Class) is           pragma Task_Name (Controller.Name.all);
   end Task_Object;
end;