package io.graceland.application;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import io.graceland.plugin.Plugin;
/**
* A simple application implementation that lets the developer define what plugins are loaded using an abstract method
* {@link #configure()}.
*/
public abstract class SimpleApplication implements Application {
private final ImmutableList.Builder<Plugin> pluginBuilder = ImmutableList.builder();
protected ImmutableList<Plugin> plugins = null;
/**
* Configure what plugins to load in this method.
*/
protected abstract void configure();
@Override
public void loadPlugin(Plugin plugin) {
Preconditions.checkNotNull(plugin, "Plugin cannot be null.");
pluginBuilder.add(plugin);
}
@Override
public ImmutableList<Plugin> getPlugins() {
if (plugins == null) {
configure();
plugins = pluginBuilder.build();
Preconditions.checkState(!plugins.isEmpty(), "At least one plugin must be loaded.");
}
return plugins;
}
}