package Smart_Pointers is

  type Client_Data is abstract tagged private;

  type Smart_Pointer is private;

  procedure Set (Self: in out Smart_Pointer; Data: in Client_Data'Class);

  function  Get (Self: Smart_Pointer) return <What to return here to make access safe?>;

  ... some more operations irrelevant to this discussion not shown

private

  ... not shown

end Smart_Pointers;

Back to text.