package org.kohsuke.args4j.spi;
import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.Option;
import java.lang.reflect.AnnotatedElement;
/**
* Abstraction of the value setter.
*
* <p>
* This abstracts away the difference between a field and a setter method, which object we are setting the value to,
* and/or how we handle collection fields differently.
*
* @author Kohsuke Kawaguchi
*/
public interface Setter<T> {
/**
* Adds/sets a value to the property of the option bean.
*
* <p>
* A {@link Setter} object has an implicit knowledge about the property it's setting,
* and the instance of the option bean.
*/
void addValue(T value) throws CmdLineException;
/**
* Gets the type of the underlying method/field.
*/
Class<T> getType();
/**
* Whether this setter is intrinsically multi-valued.
*
* When used for parsing arguments (and not options), intrinsically multi-valued setters consume
* all the remaining arguments. So if the setter can store multiple values, this method should return true.
*
* <p>
* This characteristics of a setter does not affect option parsing at all, as any options can be
* specified multiple times (which in many cases are no-op, but when your shell script expands
* multiple environment variables that each can contain options, tolerating such redundant options
* are often useful.)
*/
boolean isMultiValued();
/**
* If this setter encapsulates a field, return the direct access to that field as
* {@link FieldSetter}. This method serves two purposes.
*
* <p>
* One is that this lets {@link OptionHandler}s to bypass the collection/array handling of fields.
* This is useful if you are defining an option handler that produces array or collection
* from a single argument.
*
* <p>
* The other is to retrieve the current value of the field, via {@link FieldSetter#getValue()}.
*
* @return
* null if this setter wraps a method.
*/
FieldSetter asFieldSetter();
/**
* Returns the {@link AnnotatedElement} by which you can access annotations written on this setter.
*
* This is the same {@link AnnotatedElement} that had {@link Option}/{@link Argument}.
*
* <p>
* This enables {@link OptionHandler} to further tweak its behavior based on additional annotations.
*/
AnnotatedElement asAnnotatedElement();
}