public MethodDefinitionBuilder resultType(Method method, int flags) {
   if (Decl.isMpl(method)) {
     // Create a String with the TypeInfo
     StringBuilder sb = new StringBuilder();
     // It's a bunch of nested callables (# of param lists - 1)
     for (int i = 1; i < method.getParameterLists().size(); i++) {
       sb.append("ceylon.language::Callable<");
     }
     // Then the return type as defined originally
     sb.append(method.getType().getProducedTypeQualifiedName());
     // And then the parameter types of each nested callable
     for (int i = method.getParameterLists().size() - 1; i > 0; i--) {
       ParameterList plist = method.getParameterLists().get(i);
       for (Parameter p : plist.getParameters()) {
         sb.append(',');
         sb.append(p.getType().getProducedTypeQualifiedName());
       }
       sb.append('>');
     }
     return resultType(
         gen.makeAtType(sb.toString(), false),
         gen.makeJavaType(gen.functionalReturnType(method), flags));
   } else {
     ProducedTypedReference typedRef = gen.getTypedReference(method);
     ProducedTypedReference nonWideningTypedRef = gen.nonWideningTypeDecl(typedRef);
     ProducedType nonWideningType = gen.nonWideningType(typedRef, nonWideningTypedRef);
     return resultType(
         makeResultType(nonWideningTypedRef.getDeclaration(), nonWideningType, flags), method);
   }
 }