package com.github.czyzby.autumn.processor.impl;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.reflect.Method;
import com.github.czyzby.autumn.annotation.Initiate;
import com.github.czyzby.autumn.context.Context;
import com.github.czyzby.autumn.context.ContextDestroyer;
import com.github.czyzby.autumn.context.ContextInitializer;
import com.github.czyzby.autumn.context.impl.method.MethodInvocation;
import com.github.czyzby.autumn.context.impl.method.PrioritizedMethodInvocation;
import com.github.czyzby.autumn.processor.AbstractAnnotationProcessor;
import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays;
/** Invokes {@link Initiate}-annotated methods after the context is fully built.
*
* @author MJ */
public class InitiateAnnotationProcessor extends AbstractAnnotationProcessor<Initiate> {
private final Array<PrioritizedMethodInvocation> methods = GdxArrays.newArray();
@Override
public Class<Initiate> getSupportedAnnotationType() {
return Initiate.class;
}
@Override
public boolean isSupportingMethods() {
return true;
}
@Override
public void processMethod(final Method method, final Initiate annotation, final Object component,
final Context context, final ContextInitializer initializer, final ContextDestroyer contextDestroyer) {
methods.add(new PrioritizedMethodInvocation(method, component,
MethodInvocation.getParametersFromContext(method.getParameterTypes(), context), annotation.priority()));
}
@Override
public void doAfterScanning(final ContextInitializer initializer, final Context context,
final ContextDestroyer destroyer) {
methods.sort();
for (final PrioritizedMethodInvocation method : methods) {
method.invoke();
}
methods.clear();
}
}