@Override
public CustomFactoryInjectable getInjectable(final InjectionSite injectionSite, final FactoryNameGenerator nameGenerator) {
final String loggerName;
if (injectionSite.isAnnotationPresent(NamedLogger.class)) {
loggerName = injectionSite.getAnnotation(NamedLogger.class).value();
}
else {
loggerName = injectionSite.getEnclosingType().getFullyQualifiedName();
}
if (!injectablesByLoggerName.containsKey(loggerName)) {
final Statement loggerValue = invokeStatic(LoggerFactory.class, "getLogger", loggerName);
final FactoryBodyGenerator generator = new AbstractBodyGenerator() {
@Override
protected List<Statement> generateCreateInstanceStatements(final ClassStructureBuilder<?> bodyBlockBuilder,
final Injectable injectable, final DependencyGraph graph, final InjectionContext injectionContext) {
return Collections.singletonList(Stmt.nestedCall(loggerValue).returnValue());
}
};
final MetaClass type = MetaClassFactory.get(Logger.class);
final Qualifier qualifier = injectionContext.getQualifierFactory().forUniversallyQualified();
injectablesByLoggerName.put(loggerName, new DefaultCustomFactoryInjectable(type, qualifier,
nameGenerator.generateFor(type, qualifier, InjectableType.ExtensionProvided), Dependent.class,
Collections.singletonList(WiringElementType.DependentBean), generator));
}
return injectablesByLoggerName.get(loggerName);
}
});