I've completed a number of improvements to TWiST, including a wrapper OpenACS package. The package is available, at least for now at:
http://junom.com/openacs/twist-0.9.3.apm
The source code is not included in the package. Instead, the specified version of TWiST is downloaded from Google Projects. This make upgrading relatively simple: change the version parameter in the Application instance and restart the server.
If subversion is not available, the source code can be moved into place by hand. Any error message during install should indicate what svn command to execute on a different server, and where the current configuration will look for the files.
Users can optionally link in the example web services and the documentation by setting the link* parameters.
TWiST Improvements:
<ws>doc allows documentation of types, elements and operations. This wraps the already existing tWSDL documentation procs. Documentation does not show up in the WSDL file at the moment.
One problem with displaying documentation of a running service is that services are dynamically generated on a per-thread basis. If a service configuration file hasn't been visited by a thread, there is nothing to show. I solved this problem by showing documentation below the list of operations. All of the auto-generated code for a service is displayed, or linked to. This feature can be turned off on a per service basis, but the current default is to show documentation. See an example here:
http://junom.com/ws/stockquoter2/
As shown with the stockquoter2 example, <ws>element now supports both simpleType and complexType children, and each child can occur 0 or more times. This removes the limitation of only children of simpleTypes occurring 0 or 1 times.
As an interesting coincidence, the web form interface which allows testing, can take a space separated list for any element which allows multiple occurrences. These are converted into individual elements before being POSTed. This is a consequence that if maxOccurs is greater than 1, the input data is considered to be a Tcl list.
In addition, I have updated this interface to allow omitting optional elements (by leaving the text field blank). Since the request document is generated using the 'new' procedure for the element, the default values are filled in, but SOAP clients no longer have to send optional elements. One additional note: when a complexType is included as a child of another complexType, a default can also be included. The default is interpreted as a tcl list. This is simply a consequence of the API.