package proton.inject.listener;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import proton.inject.Injector;
import proton.inject.util.SparseClassArray;
public class FieldListeners {
private SparseClassArray<FieldListener> mListeners = new SparseClassArray<FieldListener>();
public void register(Class<? extends Annotation> annClass, FieldListener listener) {
synchronized (this) {
mListeners.put(annClass, listener);
}
}
public void unregister(Class<? extends Annotation> annClass) {
synchronized (this) {
mListeners.remove(annClass);
}
}
public boolean hasListener(Field field) {
Annotation[] anns = field.getAnnotations();
if (anns.length == 0)
return false;
synchronized (this) {
for (Annotation ann : anns) {
return mListeners.get(ann.annotationType()) != null;
}
}
return false;
}
public void call(Injector injector, Object receiver, Class<? extends Annotation> scope, Field field) {
Annotation[] anns = field.getAnnotations();
if (anns.length == 0)
return;
for (Annotation ann : anns) {
FieldListener listener;
synchronized (this) {
listener = mListeners.get(ann.annotationType());
}
if (listener != null)
listener.hear(injector, receiver, scope, field, ann);
}
}
}