> Just out of curiousity, did you delete the reference to subclassing on purpose?
No, I was envisioning a separate clause. I see two potential points of contention that need clarification.
The first is that in order to subclass, we must have some reference to the parent class, so obviously there is going to be some parts of the our code that is influenced by the original work. I'm also thinking subclass is too specific here, since it only deals with OO or other some subtyping polymorphism. I think we intend to also allow parametric polymorphism, and other extension mechanisms, such as Haskell's typeclasses which use a completely different mechanism.
The second is used for linking, rather than extension. We do allow linking by name in the original, but many languages link by structure also, and in order to do so the structure must be forward declared. This is much of the point of C header files or C# stub dll's. This is not intended to extend the interface of the original work, but simply link.
What about this? :
remain separable from the Program and Modified Works thereof, AND
(i) merely contain descriptive declarations of interfaces, types, classes, structures, functions, or files of the Program in order to link or bind by name, structure, or other binding mechanism the Program and Modified Works thereof; or
(ii) subclass or otherwise extend the functionality, or modify the structure or behavior of the interfaces to the Program and Modified Works thereof; or
(iii) document or express properties of interfaces, types, classes, structures, functions, or files to the Program and Modified Works thereof; or
The first bullet deals with linking, the second with extending, the third with validating (adding test cases, ML style module inclusion, Haskell style typeclassing, not to mention just writing a book
documenting how to use the Program). Maybe (i) and (iii) could be combined somehow.