aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/dev/isxander/yacl/config/ConfigInstance.java
blob: c2071617472a2b8b0355b27fcdb469f151493d1a (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 java.lang.reflect.InvocationTargetException;

/**
 * Responsible for handing the actual config data type.
 * Holds the instance along with a final default instance
 * to reference default values for options and should not be changed.
 *
 * Abstract methods to save and load the class, implementations are responsible for
 * how it saves and load.
 *
 * @param <T> config data type
 */
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 abstract void save();
    public abstract void load();

    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;
    }
}