Description
Defines the abstract methods that should be implemented by child classes.
    
QuickForm renderers implement the Visitor design pattern. That means that each 
form element has an accept() method that is called with a renderer 
instance as a parameter. This method does the following:
    If the element contains other elements (HTML_QuickForm_group 
    and HTML_QuickForm itself) then it iterates over them calling
    each element's accept() method and calls the methods for rendering 
    the container itself (e.g. startForm() 
    and finishForm()).
  
    If the element is simple, then it calls the renderer's method for rendering itself
    (e.g. renderHeader()).
  
    
It may seem that renderer object has to have a renderConcreteElement() method
for each HTML_QuickForm_concreteElement it may visit, but fortunately 
most of the elements have fairly similar rendering needs, so instead of separate renderTextarea() 
and renderCheckbox() we have a generic 
renderElement() method.
    
The renderer should take care of "accumulating" the information passed to its
methods and of generating some type of output based on it. How this is implemented internally
depends on the renderer type.
    
Creating your own renderer
The first thing you have to decide upon is how your renderer will accumulate the information.
You'll probably have to create some data structures to keep it (unless you are going to pass
the information to e.g. a template object at once).
    
Then you have to make concrete implementations for all the abstract 
methods defined in HTML_QuickForm_Renderer. One notable 
exception is renderHtml() method
that is implemented only in the Default renderer and will probably stay this way.
    
You'll probably also want to add some public methods for customizing the output and getting the 
results of the renderer's work. But this depends on the type of the renderer very much.
    
If you want to contribute the renderer you made to QuickForm, consider the following
Your code should be useful to other people (e.g. renderer for some obscure private template engine is a bad contribution).
Your renderer should have non-trivial usage examples.
And last but not least, you code will have to conform to PEAR coding standards.
    Tip: 
If you have examples for additional uses of an existing renderer, that will be
a welcome contribution, too.