package net.pterodactylus.sone.utils;
/**
* Contains current and default value of an option.
*
* @param <T>
* The type of the option
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
public interface Option<T> {
/**
* Returns the current value of the option. If the current value is not
* set (usually {@code null}), the default value is returned.
*
* @return The current value of the option
*/
public T get();
/**
* Returns the real value of the option. This will also return an unset
* value (usually {@code null})!
*
* @return The real value of the option
*/
public T getReal();
/**
* Validates the given value. Note that {@code null} is always a valid
* value!
*
* @param value
* The value to validate
* @return {@code true} if this option does not have a validator, or the
* validator validates this object, {@code false} otherwise
*/
public boolean validate(T value);
/**
* Sets the current value of the option.
*
* @param value
* The new value of the option
* @throws IllegalArgumentException
* if the value is not valid for this option
*/
public void set(T value) throws IllegalArgumentException;
}