package com.github.czyzby.autumn.mvc.component.ui.controller.impl;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.GdxRuntimeException;
import com.badlogic.gdx.utils.reflect.Field;
import com.badlogic.gdx.utils.reflect.ReflectionException;
import com.github.czyzby.kiwi.util.gdx.reflection.Reflection;
/** Base class for controller wrappers of annotated objects.
*
* @author MJ */
public abstract class AbstractAnnotatedController {
protected final Object wrappedObject;
private Field stageField;
public AbstractAnnotatedController(final Object wrappedObject) {
this.wrappedObject = wrappedObject;
}
/** @param stage will be injected into {@link com.github.czyzby.autumn.mvc.stereotype.ViewStage}-annotated field, if
* present. */
protected void injectStage(final Stage stage) {
if (stageField != null) {
try {
Reflection.setFieldValue(stageField, wrappedObject, stage);
} catch (final ReflectionException exception) {
throw new GdxRuntimeException("Unable to inject stage into controller: " + wrappedObject + ".",
exception);
}
}
}
/** Will inject null into {@link com.github.czyzby.autumn.mvc.stereotype.ViewStage}-annotated field. */
protected void clearStage() {
injectStage(null);
}
/** Allows to specify a field holding reference to current managed {@link com.badlogic.gdx.scenes.scene2d.Stage}.
*
* @param field will have current stage injected upon created and null upon stage destruction. */
public void registerStageField(final Field field) {
if (stageField != null) {
throw new GdxRuntimeException("Multiple stages fields annotated for view: " + wrappedObject + ".");
}
stageField = field;
}
}