Understanding Conversant: I/O
Although most people see a Conversant conversation primarily through the web, it's important to understand that Conversant is not, in and of it's self, a web application. As much as possible, Conversant is ignorant of what Input/Output method is used to bring information in and out of the application.
Actual I/O is handled by a special type of plugin, an I/O module. The standard shipping version of Conversant currently includes three I/O modules, they are the mainResponder Interface, the Email Interface, and the XML-RPC plugins ( Macrobyte has also written an NNTP I/O module that is not in the public release ). The mainResponder Interface provides the web interface either through Frontier's mainResponder server framework, through a custom responder written by Macrobyte ( the custom responder is the only option in Radio UserLand ). The Email Interface allows Conversant to act as a list server, and also accept commands via email. The XML-RPC plugin provides a way to access Conversant ( and plugin ) APIs via the XML-RPC protocol.
These, and any other I/O modules are equal partners, and each follows a basic form for setting up paramTables for it's I/O streams, and notifies other I/O modules of it's activities via three callbacks, "io_newMessage", "io_editedMessage", and "io_deletedMessage". Through these callbacks, each module can take appropriate actions as necessary. For example, when a new message is posted via the website, the mainResponder Interface calls Conversant.io.newMessage, which triggers the "io_newMessage" callback. If the Email Interface plugin is active in the conversation, it's "io_newMessage" callback queue the new message to be sent to the mail list.
Individual I/O modules can be turned on and off for any particular zone or conversation, so that you can have a fully functional conversation that acts solely as an email list and does not have a website, etc.
The advantage of this design is that at anytime additional I/O modules may be written to provide alternate means of access a conversation without requiring any changes to the modules already in place.