aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/dev/isxander/yacl/config/ConfigInstance.java
blob: e85a645578889f7852769474e2f7f0440ed56861 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package dev.isxander.yacl.config;

import dev.isxander.yacl.api.YetAnotherConfigLib;

import java.lang.reflect.InvocationTargetException;
import java.util.function.BiFunction;

public abstract class ConfigInstance<T> {
    private final Class<T> configClass;
    private final T defaultInstance;
    private T instance;

    public ConfigInstance(Class<T> configClass) {
        this.configClass = configClass;

        try {
            this.defaultInstance = this.instance = configClass.getConstructor().newInstance();
        } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
            throw new IllegalStateException(String.format("Could not create default instance of config for %s. Make sure there is a default constructor!", this.configClass.getSimpleName()));
        }

    }

    public T getConfig() {
        return this.instance;
    }

    protected void setConfig(T instance) {
        this.instance = instance;
    }

    public T getDefaults() {
        return this.defaultInstance;
    }

    public Class<T> getConfigClass() {
        return this.configClass;
    }

    public YetAnotherConfigLib buildConfig(BiFunction<ConfigInstance<T>, YetAnotherConfigLib.Builder, YetAnotherConfigLib.Builder> builder) {
        return builder.apply(this, YetAnotherConfigLib.createBuilder())
                .save(this::save)
                .build();
    }

    public abstract void save();
    public abstract void load();
}