>From my perspective, one of the beauties of Fortran 90 is infact that in the majority of cases it is not necessary to define an explicit interface and thus there is no need to maintain consistent specifications of procedures (public or private) in more than one place. Thus I would be disappointed to see the compulsory separation of implementation and specification (interface). Never-the-less Fortran 90 does have a problem with respect to the way Modules are implemented which can (and does) lead to very large source files. For example, often, one requires that instances of a derived type be declared outside the Module in which the type is defined. But is also usually required that the components of the type be invisible to the outside. In such circumstances it is necessary that all procedures that operate on this type be contained in the Module in which the type is defined, thus leading to impractically large source files. It would seem to me that a mechanisim is required which allows one to define a type in one Module (file) as PUBLIC with PRIVATE components and to be able to specify other Modules (files) for which the PRIVATE components can infact be accessed. This would allow one to partition the development of a system into smaller and more managable components, while at the same time preserving the OO ideas of encapsulation and hiding implementation details. The following pseudo code in which the new constructs UMBRELLA and UNDER are introduced is intended to illustrate my objectives. In this scheme, the UMBRELLA becomes the unit of "Object Oriented" or "logical" encapsulation and MODULES serve as a convenient means of partitioning a system. However, there is nothing to stop Modules being used in the same way that they are currently. I have no experience in language design or implementation. What follows is from a user perspective, and so would welcome suggestions for improvement. === Pseudo code follows === ! ... Define an UMBRELLA (MySystem) which USEs Modules ! which may be in different files. The entities within a ! Module which is UNDER MySystem are visible (PUBLIC) to ! all other entities within all other Modules which are ! also UNDER MySystem. UMBRELLA MySystem ! ... This UMBELLA contains the declaration of the type MyType and ! and all the procedures which operate on it. USE MyTypeModule USE MyPublicModuleA USE MyPublicModuleB USE MyPrivateModuleA USE MyPrivateModuleB END UMBRELLA MySystem MODULE MyTypeModule ! ... Declare that MyTypeModule is UNDER the MySystem UMBRELLA UNDER MySystem PUBLIC ! ... MyType is PUBLIC but its components are PRIVATE, except in ! those modules UNDER the MySystem UMBRELLA, where the ! components are PUBLIC. TYPE :: MyType PRIVATE INTEGER :: componentA ... END TYPE MyType ... END MODULE MyTypeModule MODULE MyPublicModuleA UNDER MySystem ! ... The following modules are UNDER the MySystem UMBRELLA. USE MyTypeModule USE MyPrivateModuleA ! ... The following modules are "normal" modules USE OtherModuleA PUBLIC CONTAINS SUBROUTINE SubA(x) TYPE(MyType), INTENT(IN) :: x ... ! ... components of x are visible within MyPublicModuleA ! because this module is UNDER the MySystem UMBRELLA ! of which MyTypeModule is a part. x%componentA = 1 ! ... PrivSubA is visible, again because it is UNDER the ! MySystem UMBRELLA CALL PrivSubA(x) END SUBROUTINE SubA ... END MODULE MyPublicModuleA ! ... Similar for MyPublicModuleB etc. MODULE MyPrivateModuleA UNDER MySystem USE MyTypeModule ! ... All subroutines in this module are PRIVATE except in those ! modules UNDER the MySystem UMBRELLA, in which they are ! PUBLIC. PRIVATE CONTAINS SUBROUTINE PrivSubA(x) TYPE(MyType), INTENT(IN) :: x ... x%componentA = ... END SUBROUTINE PrivSubA ... END MODULE MyPrivateModuleA ! ... Similar for MyPrivateModuleB etc. MODULE SomeOtherModule USE MyTypeModule USE MyPublicModuleA CONTAINS SUBROUTINE SomeSub(x) TYPE(MyType) :: x ! ... The components of x cannot be accessed because ! SomeOtherModule is not UNDER MySystem. ! Similarly, PrivSubA can not be called from this Module. ! However, SubA can be called because it was declared ! to be PUBLIC in MyPublicModuleA. CALL SubA(x) END SUBROUTINE SomeSub END MODULE SomeOtherModule Regards, David. ---------------------------------------------------------- David Vowles Research Officer Department of Electrical and Electronic Engineering The University of Adelaide Australia 5005 Voice: +61 8 8303 5416 Fax: +61 8 8303 4360 Email: [log in to unmask] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%