public Object invokeMethod(Object object, String methodName, Object[] arguments) {
   try {
     return delegate.invokeMethod(object, methodName, arguments);
   } catch (MissingMethodException mme) {
     // attempt builder resolution
     try {
       if (builder.getMetaClass().respondsTo(builder, methodName).isEmpty()) {
         // dispatch to factories if it is not a literal method
         return builder.invokeMethod(methodName, arguments);
       } else {
         return InvokerHelper.invokeMethod(builder, methodName, arguments);
       }
     } catch (MissingMethodException mme2) {
       // chain secondary exception
       Throwable root = mme;
       while (root.getCause() != null) {
         root = root.getCause();
       }
       root.initCause(mme2);
       // throw original
       throw mme;
     }
   }
 }