//$Id: Factory.java 4152 2007-02-26 20:31:10Z gavin $
package org.jboss.seam.annotations;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import org.jboss.seam.ScopeType;

/**
 * Marks a method as a factory method for a context variable.
 * A factory method is called whenever no value is bound to
 * the named context variable, and is expected to initialize
 * the value of the context variable. There are two kinds of 
 * factory methods. Factory methods with void return type are 
 * responsible for outjecting a value to the context variable. 
 * Factory methods which return a value do not need to 
 * explicitly ouject the value, since Seam will bind the
 * returned value to the specified scope.
 * 
 * This annotation supports use of the Seam "factory component"
 * pattern.
 * 
 * @author Gavin King
 */
@Target(METHOD)
@Retention(RUNTIME)
@Documented
public @interface Factory {
   /**
    * @return the name of the context variable
    */
   String value() default "";
   /**
    * The scope() element is meaningful only for factory 
    * methods that return the value to be outjected. 
    * Factory methods that return void are expected to
    * take responsibility for outjecting the value,
    * and then scope() is ignored.
    * 
    * If the factory method returns a value, but no 
    * scope is explicitly specified, the scope of 
    * the component with the @Factory attribute is used. 
    * But if the component scope is STATELESS, the EVENT 
    * scope is used.
    * 
    * @return the scope to outject any returned value
    */
   ScopeType scope() default ScopeType.UNSPECIFIED;
   /**
     * Specifies that this factory method should be automatically
     * called whenever the variable is asked for, even if @In does
     * not specify create=true.
     * 
    */
   boolean autoCreate() default false;
}
