expose argThat() API for stub training, make built-in argumentMatchers generic

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/proxy/branches/version-2.0-work@1519877 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/argument/ArgumentMatcherUtils.java b/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/argument/ArgumentMatcherUtils.java
index 5c9601d..bc7e295 100644
--- a/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/argument/ArgumentMatcherUtils.java
+++ b/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/argument/ArgumentMatcherUtils.java
@@ -18,6 +18,7 @@
 package org.apache.commons.proxy2.interceptor.matcher.argument;
 
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.Validate;
 import org.apache.commons.proxy2.interceptor.matcher.ArgumentMatcher;
 
@@ -27,9 +28,9 @@
 // Static Methods
 //----------------------------------------------------------------------------------------------------------------------
 
-    public static ArgumentMatcher<Object> any()
+    public static <T> ArgumentMatcher<T> any()
     {
-        return new AnyMatcher();
+        return new AnyMatcher<T>();
     }
 
     public static ArgumentMatcher<String> endsWith(String suffix)
@@ -52,14 +53,14 @@
         return new GreaterThanOrEqualMatcher<C>(comparable);
     }
 
-    public static ArgumentMatcher<Object> isA(final Class<?> type)
+    public static <T> ArgumentMatcher<T> isA(final Class<?> type)
     {
-        return new InstanceOfMatcher(type);
+        return new InstanceOfMatcher<T>(type);
     }
 
-    public static ArgumentMatcher<Object> isNull()
+    public static <T> ArgumentMatcher<T> isNull()
     {
-        return new IsNullMatcher();
+        return new IsNullMatcher<T>();
     }
 
     public static <C extends Comparable<?>> ArgumentMatcher<C> lt(C comparable)
@@ -100,10 +101,10 @@
 // Inner Classes
 //----------------------------------------------------------------------------------------------------------------------
 
-    private static final class AnyMatcher implements ArgumentMatcher<Object>
+    private static final class AnyMatcher<T> implements ArgumentMatcher<T>
     {
         @Override
-        public boolean matches(Object argument)
+        public boolean matches(T argument)
         {
             return true;
         }
@@ -146,7 +147,7 @@
         @Override
         public boolean matches(String argument)
         {
-            return argument != null && argument.endsWith(suffix);
+        	return StringUtils.endsWith(argument, suffix);
         }
     }
 
@@ -194,26 +195,26 @@
         }
     }
 
-    private static final class InstanceOfMatcher implements ArgumentMatcher<Object>
+    private static final class InstanceOfMatcher<T> implements ArgumentMatcher<T>
     {
         private final Class<?> type;
 
         public InstanceOfMatcher(Class<?> type)
         {
-            this.type = type;
+            this.type = Validate.notNull(type, "type");
         }
 
         @Override
-        public boolean matches(Object argument)
+        public boolean matches(T argument)
         {
             return type.isInstance(argument);
         }
     }
 
-    private static final class IsNullMatcher implements ArgumentMatcher<Object>
+    private static final class IsNullMatcher<T> implements ArgumentMatcher<T>
     {
         @Override
-        public boolean matches(Object argument)
+        public boolean matches(T argument)
         {
             return argument == null;
         }
@@ -284,7 +285,7 @@
         @Override
         public boolean matches(String argument)
         {
-            return argument != null && argument.startsWith(prefix);
+        	return StringUtils.startsWith(argument, prefix);
         }
     }
 }
diff --git a/stub/src/main/java/org/apache/commons/proxy2/stub/BaseTrainer.java b/stub/src/main/java/org/apache/commons/proxy2/stub/BaseTrainer.java
index 1a96990..a2b3add 100644
--- a/stub/src/main/java/org/apache/commons/proxy2/stub/BaseTrainer.java
+++ b/stub/src/main/java/org/apache/commons/proxy2/stub/BaseTrainer.java
@@ -75,25 +75,23 @@
 
     protected <R> R any(Class<R> type)
     {
-        record(ArgumentMatcherUtils.any());
-        return null;
-    }
-
-    private void record(ArgumentMatcher<?> matcher)
-    {
-        trainingContext().record(matcher);
+        return argThat(ArgumentMatcherUtils.<R> any());
     }
 
     protected <R> R eq(R value)
     {
-        record(ArgumentMatcherUtils.eq(value));
-        return value;
+        return argThat(ArgumentMatcherUtils.eq(value));
     }
 
     protected <R> R isInstance(Class<R> type)
     {
-        record(ArgumentMatcherUtils.isA(type));
-        return ProxyUtils.nullValue(type);
+        return argThat(ArgumentMatcherUtils.<R> isA(type));
+    }
+
+    protected <R> R argThat(ArgumentMatcher<R> matcher)
+    {
+        trainingContext().record(matcher);
+        return null;
     }
 
     protected void thenThrow(Exception e)