diff --git a/src/main/java/org/mvplugins/multiverse/core/configuration/node/ConfigNode.java b/src/main/java/org/mvplugins/multiverse/core/configuration/node/ConfigNode.java index b20b377f..26d0001d 100644 --- a/src/main/java/org/mvplugins/multiverse/core/configuration/node/ConfigNode.java +++ b/src/main/java/org/mvplugins/multiverse/core/configuration/node/ConfigNode.java @@ -2,6 +2,7 @@ package org.mvplugins.multiverse.core.configuration.node; import java.util.function.BiConsumer; import java.util.function.Function; +import java.util.function.Supplier; import io.vavr.control.Option; import io.vavr.control.Try; @@ -10,6 +11,7 @@ import org.jetbrains.annotations.Nullable; /** * A node that contains a value. + * * @param The type of the value. */ public class ConfigNode extends ConfigHeaderNode implements ValueNode { @@ -19,19 +21,18 @@ public class ConfigNode extends ConfigHeaderNode implements ValueNode { * * @param path The path of the node. * @param type The type of the value. - * @return The new builder. * @param The type of the value. + * @return The new builder. */ public static @NotNull ConfigNode.Builder> builder( @NotNull String path, - @NotNull Class type - ) { + @NotNull Class type) { return new ConfigNode.Builder<>(path, type); } protected final @Nullable String name; protected final @NotNull Class type; - protected final @Nullable T defaultValue; + protected final @Nullable Supplier defaultValue; protected final @Nullable NodeSerializer serializer; protected final @Nullable Function> validator; protected final @Nullable BiConsumer onSetValue; @@ -41,11 +42,10 @@ public class ConfigNode extends ConfigHeaderNode implements ValueNode { @NotNull String[] comments, @Nullable String name, @NotNull Class type, - @Nullable T defaultValue, + @Nullable Supplier defaultValue, @Nullable NodeSerializer serializer, @Nullable Function> validator, - @Nullable BiConsumer onSetValue - ) { + @Nullable BiConsumer onSetValue) { super(path, comments); this.name = name; this.type = type; @@ -76,7 +76,10 @@ public class ConfigNode extends ConfigHeaderNode implements ValueNode { */ @Override public @Nullable T getDefaultValue() { - return defaultValue; + if (defaultValue != null) { + return defaultValue.get(); + } + return null; } public @Nullable NodeSerializer getSerializer() { @@ -115,7 +118,7 @@ public class ConfigNode extends ConfigHeaderNode implements ValueNode { protected @Nullable String name; protected @NotNull final Class type; - protected @Nullable T defaultValue; + protected @Nullable Supplier defaultValue; protected @Nullable NodeSerializer serializer; protected @Nullable Function> validator; protected @Nullable BiConsumer onSetValue; @@ -142,8 +145,19 @@ public class ConfigNode extends ConfigHeaderNode implements ValueNode { * @return This builder. */ public @NotNull B defaultValue(@NotNull T defaultValue) { + this.defaultValue = () -> defaultValue; + return self(); + } + + /** + * Sets the default value for this node. + * + * @param defaultValue The default value supplier. + * @return This builder. + */ + public @NotNull B defaultValue(@NotNull Supplier defaultValue) { this.defaultValue = defaultValue; - return (B) this; + return self(); } /** @@ -154,17 +168,29 @@ public class ConfigNode extends ConfigHeaderNode implements ValueNode { */ public @NotNull B name(@Nullable String name) { this.name = name; - return (B) this; + return self(); } + /** + * Sets the serializer for this node. + * + * @param serializer The serializer for this node. + * @return This builder. + */ public @NotNull B serializer(@NotNull NodeSerializer serializer) { this.serializer = serializer; - return (B) this; + return self(); } + /** + * Sets the validator for this node. + * + * @param validator The validator for this node. + * @return This builder. + */ public @NotNull B validator(@NotNull Function> validator) { this.validator = validator; - return (B) this; + return self(); } /** @@ -175,7 +201,7 @@ public class ConfigNode extends ConfigHeaderNode implements ValueNode { */ public @NotNull B onSetValue(@NotNull BiConsumer onSetValue) { this.onSetValue = onSetValue; - return (B) this; + return self(); } /** @@ -183,7 +209,13 @@ public class ConfigNode extends ConfigHeaderNode implements ValueNode { */ @Override public @NotNull ConfigNode build() { - return new ConfigNode<>(path, comments.toArray(new String[0]), name, type, defaultValue, serializer, validator, onSetValue); + return new ConfigNode<>(path, comments.toArray(new String[0]), + name, type, defaultValue,serializer, validator, onSetValue); + } + + protected @NotNull B self() { + //noinspection unchecked + return (B) this; } } }