 -----
 Plexus Component Descriptor Creator
 -----
 Trygve Laugst�l
 -----
 25th May 2005
 -----

~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements.  See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership.  The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License.  You may obtain a copy of the License at
~~
~~   http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied.  See the License for the
~~ specific language governing permissions and limitations
~~ under the License.

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html

Plexus Component Descriptor Creator

 <<NOTE: This document and the CDC itself is currently a work in progres.>>

 The Component Descriptor Creator (or CDC for short) is a tool that will create
 the <<<components.xml>>> file from your Java code. It uses a set of JavaDoc
 tags to gather the information it needs to create the component descriptor.

* Component Tags

*-------------------------------*--------------*---------------------------------------------*
| <<Tag>>                       | <<Required>> | <<Description>>                             |
*-------------------------------*---*--------------------------------------------------------*
| @plexus.component             | y | Marker tag to mark a class as a Plexus component.      |
*-------------------------------*---*--------------------------------------------------------*
| @plexus.role                  | y | The role of the component.                             |
*-------------------------------*---*--------------------------------------------------------*
| @plexus.version               | n | The component version.                                 |
*-------------------------------*---*--------------------------------------------------------*
| @plexus.lifecycle-handler     | n | The lifecycle handler of the component.                |
*-------------------------------*---*--------------------------------------------------------*
| @plexus.instatiation-strategy | n | The instantiation strategy of the component.           |
*-------------------------------*---*--------------------------------------------------------*

+---+
/**
 * @plexus.component
 * @plexus.lifecycle-handler plexus-configurable
 */
public class DefaultActionManager
    extends AbstractLogEnabled
    implements ActionManager, Serviceable
{
+---+
~~ [example-class-tags] Example Class Tags

* Requirement Tags

 These tags are used on fields to state requirements.

*-------------------------------*----------------*-------------------------------------------*
| <<Tag>>                       | <<Required>> | <<Description>>                             |
*-------------------------------*-----*------------------------------------------------------*
| @plexus.requirement           | y   | Marker tag to mark this field as requirement         |
*-------------------------------*-----*------------------------------------------------------*
| @plexus.role                  | y/n | Only required if the field is a List or Map          |
*-------------------------------*-----*------------------------------------------------------*
| @plexus.role-hint             | n   | |
*-------------------------------*-----*------------------------------------------------------*

+---+
/**
 * @plexus.requirement
 */
private ActionManager actionManager;
+---+
~~ [example-requirement-tags] Example Requirement Tags

* Configuration Tags

 Note that the default value tag won't be required in the future when these
 tags will be used to generate a separate configuration declaration section.

*-------------------------------*--------------*---------------------------------------------*
| <<Tag>>                       | <<Required>> | <<Description>>                             |
*-------------------------------*---*--------------------------------------------------------*
| @plexus.configuration         | y | Marker tag to mark this field as configureable         |
*-------------------------------*---*--------------------------------------------------------*
| @plexus.default-value         | y | Sets the default value for the configuration field     |
*-------------------------------*---*--------------------------------------------------------*

+---+
/**
 * @plexus.requirement
 * @plexus.role-hint velocity
 */
private Renderer renderer;
+---+
~~ [example-requirement-tags] Example Requirement Tags
