private BlockBuilder<AnonymousClassStructureBuilder> getSubscriptionCallback(final Decorable decorable, final FactoryController controller) {
final MetaParameter parm = decorable.getAsParameter();
final MetaClass eventType = parm.getType().asBoxed();
final String parmClassName = eventType.getFullyQualifiedName();
final List<Annotation> annotations = InjectUtil.extractQualifiers(parm);
final Annotation[] qualifiers = annotations.toArray(new Annotation[annotations.size()]);
final Set<String> qualifierNames = new HashSet<>(CDI.getQualifiersPart(qualifiers));
final MetaClass callBackType = parameterizedAs(AbstractCDIEventCallback.class, typeParametersOf(eventType));
AnonymousClassStructureBuilder callBack = Stmt.newObject(callBackType).extend();
BlockBuilder<AnonymousClassStructureBuilder> callBackBlock;
if (!qualifierNames.isEmpty()) {
callBackBlock = callBack.initialize();
for (final String qualifierName : qualifierNames) {
callBackBlock.append(Stmt.loadClassMember("qualifierSet").invoke("add", qualifierName));
}
callBack = callBackBlock.finish();
}
final List<Statement> fireEventStmts = new ArrayList<>();
if (!decorable.isEnclosingTypeDependent()) {
fireEventStmts.add(Stmt.declareFinalVariable("instance", decorable.getEnclosingInjectable().getInjectedType(),
Stmt.invokeStatic(Factory.class, "maybeUnwrapProxy", controller.contextGetInstanceStmt())));
}
fireEventStmts.add(decorable.call(Refs.get("event")));
callBackBlock = callBack.publicOverridesMethod("fireEvent", Parameter.finalOf(eventType, "event"))
.appendAll(fireEventStmts)
.finish()
.publicOverridesMethod("toString")
._(Stmt.load("Observer: " + parmClassName + " " + Arrays.toString(qualifiers)).returnValue());
return callBackBlock;
}