public EventPropertyGetterMapped getGetterMapped(String mappedProperty) { final EventPropertyGetterMapped undMapped = underlyingEventType.getGetterMapped(mappedProperty); if (undMapped != null) { return new EventPropertyGetterMapped() { public Object get(EventBean theEvent, String mapKey) throws PropertyAccessException { if (!(theEvent instanceof DecoratingEventBean)) { throw new PropertyAccessException("Mismatched property getter to EventBean type"); } DecoratingEventBean wrapperEvent = (DecoratingEventBean) theEvent; EventBean wrappedEvent = wrapperEvent.getUnderlyingEvent(); if (wrappedEvent == null) { return null; } return undMapped.get(wrappedEvent, mapKey); } }; } final EventPropertyGetterMapped decoMapped = underlyingMapType.getGetterMapped(mappedProperty); if (decoMapped != null) { return new EventPropertyGetterMapped() { public Object get(EventBean theEvent, String mapKey) throws PropertyAccessException { if (!(theEvent instanceof DecoratingEventBean)) { throw new PropertyAccessException("Mismatched property getter to EventBean type"); } DecoratingEventBean wrapperEvent = (DecoratingEventBean) theEvent; Map map = wrapperEvent.getDecoratingProperties(); return decoMapped.get( eventAdapterService.adapterForTypedMap(map, underlyingMapType), mapKey); } }; } return null; }