// Path: src/main/java/com/endercrest/voidspawn/options/EmptyOption.java
// public final class EmptyOption<T> extends BaseOption<T> {
//     public EmptyOption(@NotNull OptionIdentifier<T> identifier) {
//         super(identifier);
//     }
// 
//     @Override
//     public Optional<T> getLoadedValue(@NotNull World world) {
//         return Optional.empty();
//     }
// 
//     @Override
//     public void setValue(@NotNull World world, String value) {}
// 
//     @Override
//     public void setValue(@NotNull World world, String[] args) throws IllegalArgumentException {}
// 
//     @Override
//     public List<String> getOptions() {
//         return Collections.emptyList();
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/Option.java
// public interface Option<T> {
//     /**
//      * Get the option identifer for this object.
//      */
//     @NotNull
//     OptionIdentifier<T> getIdentifier();
// 
//     /**
//      * Get the type that this option contains.
//      */
//     @NotNull
//     Class<T> getType();
// 
//     /**
//      * Get the value of the option for the given world.
//      * @param world The value to retrieve the value for
//      * @return Empty if value is not set.
//      */
//     Optional<T> getValue(World world);
// 
//     /**
//      * Set the value of this option
//      * @param world The world the value is being set for.
//      * @param value String value will be contained with the the {@link #getOptions()}
//      */
//     void setValue(@NotNull World world, String value) throws IllegalArgumentException;
// 
//     /**
//      * Set the value of this option
//      * @param world The world the value is being set for.
//      * @param args The arguments
//      */
//     void setValue(@NotNull World world, String[] args) throws IllegalArgumentException;
// 
//     /**
//      * Specifies all the values that are acceptable as a value.
//      * @return A non-null set of accepted values or null if any value is accepted.
//      */
//     List<String> getOptions();
// 
//     /**
//      * Get description of the option.
//      */
//     String getDescription();
// 
//     /**
//      * Get the status of this option. This is useful to get a state of the option
//      * @param world The world
//      * @return
//      */
//     @NotNull
//     Status getStatus(World world);
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/OptionIdentifier.java
// public class OptionIdentifier<T> {
//     private final Class<T> type;
//     private final String name;
//     private final String description;
// 
//     public OptionIdentifier(Class<T> type, String name, String description) {
//         this.type = type;
//         this.name = name;
//         this.description = description;
//     }
// 
//     public Class<T> getType() {
//         return type;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/container/OptionContainer.java
// public interface OptionContainer {
//     /**
//      * Attempt to retrieve a option of the given name.
//      *
//      * @param <T>        The type the option will be casted to.
//      * @param identifier The identifier for the option.
//      * @return The option if it exists, returns empty if no existing option or
//      * if the option identifier type does not match option type.
//      */
//     @NotNull <T> Option<T> getOption(OptionIdentifier<T> identifier);
// 
//     /**
//      * Attempt to retrieve a option of the given name by the name. If possible, use {@link #getOption(OptionIdentifier)} as
//      * that guarantees a type.
//      *
//      * @param name The name of the option to retrieve.
//      * @return The option or null if doesn't exist.
//      */
//     @Nullable Option<?> getOption(String name);
// 
//     /**
//      * Get a list of all options for this mode.
//      *
//      * @return non-null list of options
//      */
//     Collection<Option<?>> getOptions();
// }


import com.endercrest.voidspawn.options.EmptyOption;
import com.endercrest.voidspawn.options.Option;
import com.endercrest.voidspawn.options.OptionIdentifier;
import com.endercrest.voidspawn.options.container.OptionContainer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
package com.endercrest.voidspawn.options.container;



public abstract class BasicOptionContainer implements OptionContainer {
    private final Map<String, Option<?>> options = new HashMap<>();

    protected void attachOption(Option<?> option) {
        options.put(option.getIdentifier().getName(), option);
    }

// Path: src/main/java/com/endercrest/voidspawn/options/EmptyOption.java
// public final class EmptyOption<T> extends BaseOption<T> {
//     public EmptyOption(@NotNull OptionIdentifier<T> identifier) {
//         super(identifier);
//     }
// 
//     @Override
//     public Optional<T> getLoadedValue(@NotNull World world) {
//         return Optional.empty();
//     }
// 
//     @Override
//     public void setValue(@NotNull World world, String value) {}
// 
//     @Override
//     public void setValue(@NotNull World world, String[] args) throws IllegalArgumentException {}
// 
//     @Override
//     public List<String> getOptions() {
//         return Collections.emptyList();
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/Option.java
// public interface Option<T> {
//     /**
//      * Get the option identifer for this object.
//      */
//     @NotNull
//     OptionIdentifier<T> getIdentifier();
// 
//     /**
//      * Get the type that this option contains.
//      */
//     @NotNull
//     Class<T> getType();
// 
//     /**
//      * Get the value of the option for the given world.
//      * @param world The value to retrieve the value for
//      * @return Empty if value is not set.
//      */
//     Optional<T> getValue(World world);
// 
//     /**
//      * Set the value of this option
//      * @param world The world the value is being set for.
//      * @param value String value will be contained with the the {@link #getOptions()}
//      */
//     void setValue(@NotNull World world, String value) throws IllegalArgumentException;
// 
//     /**
//      * Set the value of this option
//      * @param world The world the value is being set for.
//      * @param args The arguments
//      */
//     void setValue(@NotNull World world, String[] args) throws IllegalArgumentException;
// 
//     /**
//      * Specifies all the values that are acceptable as a value.
//      * @return A non-null set of accepted values or null if any value is accepted.
//      */
//     List<String> getOptions();
// 
//     /**
//      * Get description of the option.
//      */
//     String getDescription();
// 
//     /**
//      * Get the status of this option. This is useful to get a state of the option
//      * @param world The world
//      * @return
//      */
//     @NotNull
//     Status getStatus(World world);
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/OptionIdentifier.java
// public class OptionIdentifier<T> {
//     private final Class<T> type;
//     private final String name;
//     private final String description;
// 
//     public OptionIdentifier(Class<T> type, String name, String description) {
//         this.type = type;
//         this.name = name;
//         this.description = description;
//     }
// 
//     public Class<T> getType() {
//         return type;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/container/OptionContainer.java
// public interface OptionContainer {
//     /**
//      * Attempt to retrieve a option of the given name.
//      *
//      * @param <T>        The type the option will be casted to.
//      * @param identifier The identifier for the option.
//      * @return The option if it exists, returns empty if no existing option or
//      * if the option identifier type does not match option type.
//      */
//     @NotNull <T> Option<T> getOption(OptionIdentifier<T> identifier);
// 
//     /**
//      * Attempt to retrieve a option of the given name by the name. If possible, use {@link #getOption(OptionIdentifier)} as
//      * that guarantees a type.
//      *
//      * @param name The name of the option to retrieve.
//      * @return The option or null if doesn't exist.
//      */
//     @Nullable Option<?> getOption(String name);
// 
//     /**
//      * Get a list of all options for this mode.
//      *
//      * @return non-null list of options
//      */
//     Collection<Option<?>> getOptions();
// }


// Path: src/main/java/com/endercrest/voidspawn/options/container/BasicOptionContainer.java
import com.endercrest.voidspawn.options.EmptyOption;
import com.endercrest.voidspawn.options.Option;
import com.endercrest.voidspawn.options.OptionIdentifier;
import com.endercrest.voidspawn.options.container.OptionContainer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

package com.endercrest.voidspawn.options.container;



public abstract class BasicOptionContainer implements OptionContainer {
    private final Map<String, Option<?>> options = new HashMap<>();

    protected void attachOption(Option<?> option) {
        options.put(option.getIdentifier().getName(), option);
    }

    protected void detachOption(@NotNull OptionIdentifier<?> identifier) {