package edu.stanford.nlp.ling;
/**
* A <code>LabelFactory</code> object acts as a factory for creating
* objects of class <code>Label</code>, or some descendant class.
* It can also make Labels from Strings, optionally with options.
*
* @author Christopher Manning
* @version 2000/12/25
*/
public interface LabelFactory {
/**
* Make a new label with this <code>String</code> as the
* <code>value</code>.
* Any other fields of the label would normally be <code>null</code>.
*
* @param labelStr The String that will be used for value
* @return The new Label
*/
public Label newLabel(String labelStr);
/**
* Make a new label with this <code>String</code> as the value, and
* the type determined in an implementation-dependent way from the
* options value.
*
* @param labelStr The String that will be used for value
* @param options May determine what kind of label is created
* @return The new Label
*/
public Label newLabel(String labelStr, int options);
/**
* Make a new label. The String argument will be decomposed into
* multiple fields in an implementing class-specific way, in
* accordance with the class's setFromString() method.
*
* @param encodedLabelStr The String that will be used for labelling the
* object (by decoding it into parts)
* @return The new Label
*/
public Label newLabelFromString(String encodedLabelStr);
/**
* Create a new <code>Label</code>, where the label is formed from
* the <code>Label</code> object passed in. The new Label is
* guaranteed to at least copy the <code>value()</code> of the
* source label (if non-null); it may also copy other components
* (this is implementation-specific). However, if oldLabel is of
* the same type as is produced by the factory, then the whole
* label should be cloned, so that the returnedLabel.equals(oldLabel).
* <i>Implementation note:</i> That last sentence isn't true of all
* current implementations (e.g., WordTag), but we should make it
* so that it is true!
*
* @param oldLabel The Label that the new label is being created from
* @return The new label of a particular type
*/
public Label newLabel(Label oldLabel);
}