List<DroneInstanceEnhancer> enhancers = new ArrayList<DroneInstanceEnhancer>(serviceLoader.get().all(
DroneInstanceEnhancer.class));
Collections.sort(enhancers, PrecedenceComparator.getInstance());
InstanceOrCallableInstance browser = droneInstance.getInstance();
final Class<?> type = droneInstance.getDroneType();
final Class<? extends Annotation> qualifier = droneInstance.getQualifier();
for (DroneInstanceEnhancer enhancer : enhancers) {
if (enhancer.canEnhance(browser, type, qualifier)) {
log.log(Level.FINE,
"Enhancing {0} @{1} using enhancer {2} with precedence {3}",
new Object[] { type.getSimpleName(), qualifier.getSimpleName(), enhancer.getClass().getName(),
enhancer.getPrecedence() });
droneEnhancementEvent.fire(new BeforeDroneEnhanced(enhancer, browser, type, qualifier));
Object newBrowser = enhancer.enhance(browser.asInstance(type), qualifier);
browser.set(newBrowser);
droneEnhancementEvent.fire(new AfterDroneEnhanced(browser, type, qualifier));
}
}
}