@SuppressWarnings({ "rawtypes", "unchecked" })
public void enhanceDrone(@Observes AfterDroneInstantiated droneInstance, DroneContext context) {
List<Enhancer> enhancers = new ArrayList<Enhancer>(serviceLoader.get().all(Enhancer.class));
Collections.sort(enhancers, PrecedenceComparator.getInstance());
InstanceOrCallableInstance browser = droneInstance.getInstance();
final Class<?> type = droneInstance.getDroneType();
final Class<? extends Annotation> qualifier = droneInstance.getQualifier();
for (Enhancer enhancer : enhancers) {
if (enhancer.canEnhance(type, qualifier)) {
if (log.isLoggable(Level.FINE)) {
log.fine("Eenhancing using enhancer: " + enhancer.getClass().getName() + ", with precedence "
+ 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));
}
}
}