@Override public <T> void extract(ModelSchemaExtractionContext<T> extractionContext) { Type type = extractionContext.getType().getType(); if (!(type instanceof Class)) { return; } Class<?> contractType = (Class<?>) type; if (!contractType.isInterface()) { return; } if (contractType.getGenericInterfaces().length != 1) { return; } Type superType = contractType.getGenericInterfaces()[0]; if (!(superType instanceof ParameterizedType)) { return; } ParameterizedType parameterizedSuperType = (ParameterizedType) superType; if (!parameterizedSuperType.getRawType().equals(ModelMap.class)) { return; } ModelType<?> elementType = ModelType.of(parameterizedSuperType.getActualTypeArguments()[0]); Class<?> proxyImpl = generator.generate(ModelMapGroovyDecorator.Managed.class, contractType); extractionContext.found( new SpecializedMapSchema<T>(extractionContext.getType(), elementType, proxyImpl)); }