Writing OLE Automation Server Questions

I'm starting an app that I want to also run as an OLE automation
server to third party applications. While I have the 'basics' down I
do have a couple of problems.
The app itself has an object tree like structure and is meant to
follow the same kind of structure used in MS Word and other OLE
Servers.

1) I'd like the app internally to use the same object model that is
present to third parties (why code everything twice?). However, the
problem is that there are some functions that I don't want to make
public. For example, a 'Write List To TStrings' function could be used
in an object, but you wouldn't want it made available externally.
Interfaces don't allow private declarations as such so the question is
how to implement them correctly.

My thoughts are to create 2 interfaces, one private and internal and
one public :

 IPublicInterface = interface
   function GetCount : Integer;
   function GetItem(index : Integer)  : IAnotherPublicInterface
 end;

 IPrivateInterface = interface(IPublicInterface)
   function WriteObjectToStrings
 end;

Internally, the app will always use the IPrivateInterface of an object
but when addressing the public, the app will pass the user the Public
interface from the object.
Any nicer way of doing this without having to come up with two names
(one public, one private) for each interface?

2) How the heck do you implement the idea of lists in COM?

i.e.

  IMyObject = interface
    function GetCount : Integer;
    function GetItem(Index : Integer) : IAnotherInterface;
  end;

  TMyObject = class(TInterfacedObject,IMyObject)
  private
    FList : TInterfaceList;//assume this is created and initialized
somewhere (i've not included it)
  public

    function GetCount : Integer;
    function GetItem(Index : Integer) : IAnotherInterface;
  end;

  function TMyObject.GetCount : Integer;
  begin
    Result := FList.Count;
  end;

  function TMyObject.GetItem(Index : Integer) : IAnotherInterface;
  begin
    Result := IAnotherInterface(FList[Index]);
  end;

Whenever I use this kind of code and obtain an IAnotherInterface
reference from the Main Automation object I always get catastrophic
error. Is it something to do with making the interfaces inherited from
IDispatch? If so, then I guess I need to manage the objects through
the class factory?
I don't know whether I need to make the TMyObject an automation object
or not.

Gah! Mind boggling stuff. I even have the book on COM and Interfaces
in Delphi and that doesn't go into detail. The only section on
Automation covered a single object Server without 'subobjects'.

Anyone have any suggestions?

Cheers,

Andy