Index: /Users/jeffbrown/Documents/workspace/groovy/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java =================================================================== --- /Users/jeffbrown/Documents/workspace/groovy/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java (revision 5332) +++ /Users/jeffbrown/Documents/workspace/groovy/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java (working copy) @@ -264,9 +264,10 @@ /** * Scoped use method + * @return the value returned from the closure */ - public static void use(Object self, Class categoryClass, Closure closure) { - GroovyCategorySupport.use(categoryClass, closure); + public static Object use(Object self, Class categoryClass, Closure closure) { + return GroovyCategorySupport.use(categoryClass, closure); } /** @@ -271,9 +272,10 @@ /** * Scoped use method with list of categories + * @return the value returned from the closure */ - public static void use(Object self, List categoryClassList, Closure closure) { - GroovyCategorySupport.use(categoryClassList, closure); + public static Object use(Object self, List categoryClassList, Closure closure) { + return GroovyCategorySupport.use(categoryClassList, closure); } /** @@ -294,8 +296,9 @@ * * @param self * @param array + * @return the value returned from the closure */ - public static void use(Object self, Object[] array) { + public static Object use(Object self, Object[] array) { if (array.length < 2) throw new IllegalArgumentException( "Expecting at least 2 arguments, a category class and a Closure"); @@ -308,7 +311,7 @@ List list = new ArrayList(array.length - 1); for (int i = 0; i < array.length - 1; ++i) list.add(array[i]); - GroovyCategorySupport.use(list, closure); + return GroovyCategorySupport.use(list, closure); } /** Index: /Users/jeffbrown/Documents/workspace/groovy/src/main/org/codehaus/groovy/runtime/GroovyCategorySupport.java =================================================================== --- /Users/jeffbrown/Documents/workspace/groovy/src/main/org/codehaus/groovy/runtime/GroovyCategorySupport.java (revision 5332) +++ /Users/jeffbrown/Documents/workspace/groovy/src/main/org/codehaus/groovy/runtime/GroovyCategorySupport.java (working copy) @@ -141,12 +141,13 @@ * * @param categoryClass the class containing category methods * @param closure the closure during which to make the category class methods available + * @return the value returned from the closure */ - public static void use(Class categoryClass, Closure closure) { + public static Object use(Class categoryClass, Closure closure) { newScope(); try { use(categoryClass); - closure.call(); + return closure.call(); } finally { endScope(); } @@ -157,8 +158,9 @@ * * @param categoryClasses the list of classes containing category methods * @param closure the closure during which to make the category class methods available + * @return the value returned from the closure */ - public static void use(List categoryClasses, Closure closure) { + public static Object use(List categoryClasses, Closure closure) { newScope(); try { for (Iterator i = categoryClasses.iterator(); i.hasNext(); ) { @@ -165,7 +167,7 @@ Class clazz = (Class) i.next(); use(clazz); } - closure.call(); + return closure.call(); } finally { endScope(); } Index: /Users/jeffbrown/Documents/workspace/groovy/src/test/groovy/CategoryTest.groovy =================================================================== --- /Users/jeffbrown/Documents/workspace/groovy/src/test/groovy/CategoryTest.groovy (revision 5332) +++ /Users/jeffbrown/Documents/workspace/groovy/src/test/groovy/CategoryTest.groovy (working copy) @@ -19,7 +19,13 @@ } shouldFail(MissingMethodException, { "Sam".lower() }); } - + + void testReturnValue() { + def returnValue = use(StringCategory) { + "Green Eggs And Ham".lower() + } + assert "green eggs and ham" == returnValue + } void testCategoryDefinedProperties() { use(CategoryTestPropertyCategory) {