public static CodegenMethod from(CodegenMethodScope codegenMethodScope, CodegenClassScope codegenClassScope, Class expectedUnderlyingType, EventPropertyGetterSPI innerGetter, AccessType accessType, Class generator) {
CodegenMethod methodNode = codegenMethodScope.makeChild(accessType == AccessType.EXISTS ? boolean.class : Object.class, generator, codegenClassScope).addParam(Object.class, "value");
CodegenBlock block = methodNode.getBlock()
.ifNotInstanceOf("value", expectedUnderlyingType)
.ifInstanceOf("value", EventBean.class)
.declareVarWCast(EventBean.class, "bean", "value");
if (accessType == AccessType.GET) {
block = block.blockReturn(innerGetter.eventBeanGetCodegen(ref("bean"), codegenMethodScope, codegenClassScope));
} else if (accessType == AccessType.EXISTS) {
block = block.blockReturn(innerGetter.eventBeanExistsCodegen(ref("bean"), codegenMethodScope, codegenClassScope));
} else if (accessType == AccessType.FRAGMENT) {
block = block.blockReturn(innerGetter.eventBeanFragmentCodegen(ref("bean"), codegenMethodScope, codegenClassScope));
} else {
throw new UnsupportedOperationException("Invalid access type " + accessType);
}
block = block.blockReturn(constant(accessType == AccessType.EXISTS ? false : null));
CodegenExpression expression;
if (accessType == AccessType.GET) {
expression = innerGetter.underlyingGetCodegen(cast(expectedUnderlyingType, ref("value")), codegenMethodScope, codegenClassScope);
} else if (accessType == AccessType.EXISTS) {
expression = innerGetter.underlyingExistsCodegen(cast(expectedUnderlyingType, ref("value")), codegenMethodScope, codegenClassScope);
} else if (accessType == AccessType.FRAGMENT) {
expression = innerGetter.underlyingFragmentCodegen(cast(expectedUnderlyingType, ref("value")), codegenMethodScope, codegenClassScope);
} else {
throw new UnsupportedOperationException("Invalid access type " + accessType);
}
block.methodReturn(expression);
return methodNode;
}