I would like to commit a minor change to the annotations woodstock 
provides.  The change allows a @Component annotation to take a 
"rendererClass" attribute to specify a Renderer that should be used to 
Renderer the UIComponent.
The motivation for this new feature is to be able to skip creating a new 
Renderer for a component entirely.  Jason Lee and I are experimenting 
around with the Woodstock annotations + JSFTemplating's TemplateRenderer 
to create components.  I think this is a good combination that reduces 
development to 2 files: UIComponent file, and a template file.  However, 
the current annotations require a Renderer class to be present to place 
a @Renderer annotation... and we don't have such a file in our environment.
I have run the annotation processor before and after this change and 
compared the results.  There is no difference at all (as there shouldn't 
be since it only adds an optional property which isn't currently present 
on any Woodstock components).
The diffs are attached.  Please let me know if you have any objections 
to me checking in this change.  Or if I should check it in somewhere 
other than the HEAD.
Thanks!
Ken
woodstock/annotations> cvs -q diff -u
Index: library/src/com/sun/faces/annotation/Component.java
===================================================================
RCS file: 
/cvs/woodstock/annotations/library/src/com/sun/faces/annotation/Component.java,v
retrieving revision 1.1
diff -u -r1.1 Component.java
--- library/src/com/sun/faces/annotation/Component.java 15 Feb 2007 
21:47:16 -0000      1.1
+++ library/src/com/sun/faces/annotation/Component.java 31 Aug 2007 
21:28:05 -0000
@@ -134,6 +134,8 @@
      * is set to false), then providing a value for this element has no 
effect.
      */
     public String tagRendererType() default "";
+
+    public String rendererClass() default "";
     /**
      * An optional short description of this component, typically used 
as a tool
Index: library/src/com/sun/faces/annotation/Renderer.java
===================================================================
RCS file: 
/cvs/woodstock/annotations/library/src/com/sun/faces/annotation/Renderer.java,v
retrieving revision 1.1
diff -u -r1.1 Renderer.java
--- library/src/com/sun/faces/annotation/Renderer.java  15 Feb 2007 
21:48:01 -0000      1.1
+++ library/src/com/sun/faces/annotation/Renderer.java  31 Aug 2007 
21:28:05 -0000
@@ -82,6 +82,8 @@
     @Target(ElementType.ANNOTATION_TYPE)
     public @interface Renders {
+        public String rendererClass() default "";
+
         /**
          * The renderer type for this component and renderer 
combination. If
          * this annotation contains a single component family, and a 
renderer type
Index: processor/src/com/sun/faces/mirror/DeclaredRendererInfo.java
===================================================================
RCS file: 
/cvs/woodstock/annotations/processor/src/com/sun/faces/mirror/DeclaredRendererInfo.java,v
retrieving revision 1.1
diff -u -r1.1 DeclaredRendererInfo.java
--- processor/src/com/sun/faces/mirror/DeclaredRendererInfo.java        
15 Feb 2007 21:56:49 -0000      1.1
+++ processor/src/com/sun/faces/mirror/DeclaredRendererInfo.java        
31 Aug 2007 21:28:06 -0000
@@ -44,9 +44,10 @@
         this.annotationValueMap = annotationValueMap;
         renderings = new ArrayList<RendersInfo>();
         if (this.annotationValueMap.containsKey(VALUE)) {
+           String qn = decl.getQualifiedName();
             for (Object value : (List) 
this.annotationValueMap.get(VALUE)) {
                 Map nestedAnnotationValueMap = (Map) value;
-                renderings.add(new RendersInfo(nestedAnnotationValueMap));
+                renderings.add(new 
RendersInfo(nestedAnnotationValueMap, qn));
             }
         }
     }
@@ -60,15 +61,28 @@
      */
     static public class RendersInfo {
+        static String RENDERER_CLASS = "rendererClass";
         static String RENDERER_TYPE = "rendererType";
         static String COMPONENT_FAMILY = "componentFamily";
         Map annotationValueMap;
+       String className;
-        RendersInfo(Map annotationValueMap) {
+        RendersInfo(Map annotationValueMap, String className) {
             this.annotationValueMap = annotationValueMap;
+           this.className = className;
         }
+       /**
+        *  The renderer class (the qualified name by default).
+        */
+        public String getRendererClass() {
+            if (this.annotationValueMap.containsKey(RENDERER_CLASS)) {
+                return (String) 
this.annotationValueMap.get(RENDERER_CLASS);
+           }
+           return this.className;
+       }
+
         /**
          * The renderer type.
          */
Index: processor/src/com/sun/faces/mirror/FacesAnnotationProcessor.java
===================================================================
RCS file: 
/cvs/woodstock/annotations/processor/src/com/sun/faces/mirror/FacesAnnotationProcessor.java,v
retrieving revision 1.2
diff -u -r1.2 FacesAnnotationProcessor.java
--- processor/src/com/sun/faces/mirror/FacesAnnotationProcessor.java    
9 Jun 2007 13:35:41 -0000       1.2
+++ processor/src/com/sun/faces/mirror/FacesAnnotationProcessor.java    
31 Aug 2007 21:28:08 -0000
@@ -197,6 +197,30 @@
                         this.declaredComponentSet.add(componentInfo);
                         
this.declaredClassMap.put(typeDecl.getQualifiedName(), componentInfo);
                         typeInfo = componentInfo;
+                       // Check to see if this annotation also 
specifies a Renderer
+                       Object rendererClass = 
annotationValueMap.get("rendererClass");
+                       if ((rendererClass != null)
+                               && !rendererClass.toString().equals("")) {
+                           // Create the "Renders" Map
+                           Map renders = new HashMap();
+                           renders.put("rendererClass", rendererClass);
+                           Object type = 
annotationValueMap.get("tagRendererType");
+                           if ((type == null) || 
type.toString().equals("")) {
+                               type = annotationValueMap.get("type");
+                           }
+                           renders.put("rendererType", type);
+                           ArrayList families = new ArrayList();
+                           families.add(annotationValueMap.get("family"));
+                           renders.put("componentFamily", families);
+
+                           List list = new ArrayList();
+                           list.add(renders);
+                           Map rendererMap = new HashMap();
+                           rendererMap.put("value", list);
+                           DeclaredRendererInfo rendererInfo =
+                                new DeclaredRendererInfo(rendererMap, 
(ClassDeclaration) typeDecl);
+                           this.declaredRendererSet.add(rendererInfo);
+                       }
                     } else if (typeDecl.getAnnotation(Renderer.class) 
!= null) {
                         // This is a renderer class
                         Map<String,Object> annotationValueMap =
Index: processor/src/com/sun/faces/mirror/generator/FacesConfig.template
===================================================================
RCS file: 
/cvs/woodstock/annotations/processor/src/com/sun/faces/mirror/generator/FacesConfig.template,v
retrieving revision 1.2
diff -u -r1.2 FacesConfig.template
--- processor/src/com/sun/faces/mirror/generator/FacesConfig.template   
17 Feb 2007 23:50:09 -0000      1.2
+++ processor/src/com/sun/faces/mirror/generator/FacesConfig.template   
31 Aug 2007 21:28:08 -0000
@@ -52,7 +52,7 @@
         <renderer>
             <component-family>${componentFamily}</component-family>
             <renderer-type>${rendering.rendererType}</renderer-type>
-            <renderer-class>${rendererInfo.qualifiedName}</renderer-class>
+            <renderer-class>${rendering.rendererClass}</renderer-class>
         </renderer>
 #end
 #end