Index: /home/jmares/workspace/easymock-propertyutils/src/main/java/com/stephenduncanjr/easymock/EasyMockPropertyUtils.java
===================================================================
--- /home/jmares/workspace/easymock-propertyutils/src/main/java/com/stephenduncanjr/easymock/EasyMockPropertyUtils.java	(revision 103)
+++ /home/jmares/workspace/easymock-propertyutils/src/main/java/com/stephenduncanjr/easymock/EasyMockPropertyUtils.java	(working copy)
@@ -15,12 +15,10 @@
 
 import static org.easymock.EasyMock.reportMatcher;
 
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
 import java.beans.PropertyDescriptor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -26,6 +24,8 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.beanutils.PropertyUtils;
+
 import com.stephenduncanjr.easymock.matcher.BeanProperty;
 
 /**
@@ -37,6 +37,8 @@
  */
 public class EasyMockPropertyUtils
 {
+   protected static List<String> EMPTY = new ArrayList<String>();
+   
 	/**
 	 * Disables object creation.
 	 */
@@ -57,7 +59,7 @@
 	 *        The map of property names to property values.
 	 * @return fake return value for EasyMock use.
 	 */
-	public static <T> T propertiesEq(@SuppressWarnings("unused")
+	public static <T> T propEq(@SuppressWarnings("unused")
 	final Class<T> inClass, final Map<String, ?> properties)
 	{
 		reportMatcher(new BeanProperty(properties));
@@ -77,10 +79,10 @@
 	 * @return fake return value for EasyMock use.
 	 * @since 1.1
 	 */
-	public static <T> T propertiesEq(@SuppressWarnings("unused")
+	public static <T> T propEq(@SuppressWarnings("unused")
 	final Class<T> inClass, final Object valuesObject)
 	{
-		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, null)));
+		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, EMPTY, true)));
 		return null;
 	}
 
@@ -100,35 +102,35 @@
 	 * @return fake return value for EasyMock use.
 	 * @since 1.1
 	 */
-	public static <T> T propertiesEq(@SuppressWarnings("unused")
+	public static <T> T propEq(@SuppressWarnings("unused")
 	final Class<T> inClass, final Object valuesObject, final List<String> ignored)
 	{
-		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, ignored)));
+		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, ignored, true)));
 		return null;
 	}
 
-	/**
-	 * EasyMock matcher for the properties on the argument to match the
-	 * properties on the given object, ignoring the properties named in the
-	 * given array.
-	 * 
-	 * @param <T>
-	 *        The type of object to match.
-	 * @param inClass
-	 *        The type of the object to match.
-	 * @param valuesObject
-	 *        the object to match values against.
-	 * @param ignored
-	 *        the list of property names to ignore.
-	 * @return fake return value for EasyMock use.
-	 * @since 1.1
-	 */
-	public static <T> T propertiesEq(@SuppressWarnings("unused")
-	final Class<T> inClass, final Object valuesObject, final String[] ignored)
-	{
-		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, Arrays.asList(ignored))));
-		return null;
-	}
+    /**
+     * EasyMock matcher for the properties on the argument to match the
+     * properties on the given object, ignoring the properties named in the
+     * given array.
+     * 
+     * @param <T>
+     *        The type of object to match.
+     * @param inClass
+     *        The type of the object to match.
+     * @param valuesObject
+     *        the object to match values against.
+     * @param ignored
+     *        the list of property names to ignore.
+     * @return fake return value for EasyMock use.
+     * @since 1.1
+     */
+    public static <T> T propEq(@SuppressWarnings("unused")
+    final Class<T> inClass, final Object valuesObject, final String[] ignored)
+    {
+        reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, Arrays.asList(ignored), true)));
+        return null;
+    }
 
 	/**
 	 * EasyMock matcher for the properties on the argument to match the
@@ -141,12 +143,31 @@
 	 * @return fake return value for EasyMock use.
 	 * @since 1.1
 	 */
-	public static <T> T propertiesEq(final T valuesObject)
+	public static <T> T propEq(final T valuesObject)
 	{
-		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, null)));
+		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, EMPTY, true)));
 		return null;
 	}
 
+    /**
+     * EasyMock matcher for the properties on the argument to match the
+     * properties on the given object.
+     * 
+     * @param <T>
+     *        The type of object to match.
+     * @param valuesObject
+     *        the object to match values against.
+    * @param notUseAnnotations 
+    *        the marker that the annotations should not be used
+     * @return fake return value for EasyMock use.
+     * @since 1.1
+     */
+    public static <T> T propEq(final T valuesObject, boolean notUseAnnotations)
+    {
+        reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, EMPTY, false)));
+        return null;
+    }
+
 	/**
 	 * EasyMock matcher for the properties on the argument to match the
 	 * properties on the given object, ignoring the properties named in the
@@ -161,12 +182,34 @@
 	 * @return fake return value for EasyMock use.
 	 * @since 1.1
 	 */
-	public static <T> T propertiesEq(final T valuesObject, final List<String> ignored)
+	public static <T> T propEq(final T valuesObject, final List<String> ignored)
 	{
-		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, ignored)));
+		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, ignored, true)));
 		return null;
 	}
 
+    /**
+     * EasyMock matcher for the properties on the argument to match the
+     * properties on the given object, ignoring the properties named in the
+     * given list.
+     * 
+     * @param <T>
+     *        The type of object to match.
+     * @param valuesObject
+     *        the object to match values against.
+     * @param ignored
+     *        the list of property names to ignore.
+    * @param notUseAnnotations 
+    *        the marker that the annotations should not be used
+     * @return fake return value for EasyMock use.
+     * @since 1.1
+     */
+    public static <T> T propEq(final T valuesObject, final List<String> ignored, boolean notUseAnnotations)
+    {
+        reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, ignored, false)));
+        return null;
+    }
+
 	/**
 	 * EasyMock matcher for the properties on the argument to match the
 	 * properties on the given object, ignoring the properties named in the
@@ -181,12 +224,34 @@
 	 * @return fake return value for EasyMock use.
 	 * @since 1.1
 	 */
-	public static <T> T propertiesEq(final T valuesObject, final String[] ignored)
+	public static <T> T propEq(final T valuesObject, final String[] ignored)
 	{
-		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, Arrays.asList(ignored))));
+		reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, Arrays.asList(ignored), true)));
 		return null;
 	}
 
+    /**
+     * EasyMock matcher for the properties on the argument to match the
+     * properties on the given object, ignoring the properties named in the
+     * given array.
+     * 
+     * @param <T>
+     *        The type of object to match.
+     * @param valuesObject
+     *        the object to match values against.
+     * @param ignored
+     *        the list of property names to ignore.
+    * @param notUseAnnotations 
+    *        the marker that the annotations should not be used
+     * @return fake return value for EasyMock use.
+     * @since 1.1
+     */
+    public static <T> T propEq(final T valuesObject, final String[] ignored, boolean notUseAnnotations)
+    {
+        reportMatcher(new BeanProperty(retrieveAndFilterProperties(valuesObject, Arrays.asList(ignored), false)));
+        return null;
+    }
+
 	/**
 	 * EasyMock matcher for the property on the object to be matched being equal
 	 * to the given value.
@@ -201,7 +266,7 @@
 	 *        The value of the property to ccompare against.
 	 * @return fake return value for EasyMock use.
 	 */
-	public static <T> T propertyEq(@SuppressWarnings("unused")
+	public static <T> T propEq(@SuppressWarnings("unused")
 	final Class<T> inClass, final String property, final Object value)
 	{
 		reportMatcher(new BeanProperty(property, value));
@@ -214,30 +279,24 @@
 	 * 
 	 * @param bean
 	 * @param ignoredProperties
+     * @param useAnnotations Determines whether the ignoring of properties should be done using annotations too
 	 * @return map of properties names to values.
 	 */
-	private static Map<String, Object> retrieveAndFilterProperties(final Object bean, final List<String> ignoredProperties)
+	protected static Map<String, Object> retrieveAndFilterProperties(final Object bean, final List<String> ignoredProperties, final boolean useAnnotations)
 	{
 		final Map<String, Object> map = new HashMap<String, Object>();
-
+        
 		try
 		{
-			BeanInfo info;
-			info = Introspector.getBeanInfo(bean.getClass());
-
-			for(final PropertyDescriptor p : info.getPropertyDescriptors())
+			for(final PropertyDescriptor p : PropertyUtils.getPropertyDescriptors(bean.getClass()))
 			{
-				final Method readMethod = p.getReadMethod();
-				final Object value = readMethod.invoke(bean);
-				map.put(p.getName(), value);
+               if (!(ignoredProperties.contains(p.getName())) && !("class".equals(p.getName()))) {
+                  final Method readMethod = p.getReadMethod();
+                  if ((!useAnnotations) || (readMethod.getAnnotation(IgnoreProp.class) == null)) {
+                     map.put(p.getName(), readMethod.invoke(bean));
+                  }
+               }
 			}
-
-			// Must remove the class property, as it should be ignored.
-			map.remove("class");
-		}
-		catch(final IntrospectionException e)
-		{
-			throw new IllegalArgumentException(e);
 		}
 		catch(final IllegalAccessException e)
 		{
@@ -247,13 +306,6 @@
 		{
 			throw new IllegalArgumentException(e);
 		}
-
-		if(ignoredProperties != null)
-		{
-			for(final String property : ignoredProperties)
-				map.remove(property);
-		}
-
 		return map;
 	}
 }
\ No newline at end of file
Index: /home/jmares/workspace/easymock-propertyutils/src/main/java/com/stephenduncanjr/easymock/IgnoreProp.java
===================================================================
--- /home/jmares/workspace/easymock-propertyutils/src/main/java/com/stephenduncanjr/easymock/IgnoreProp.java	(revision 0)
+++ /home/jmares/workspace/easymock-propertyutils/src/main/java/com/stephenduncanjr/easymock/IgnoreProp.java	(revision 0)
@@ -0,0 +1,15 @@
+/*
+ * Created on 15.1.2007
+ */
+package com.stephenduncanjr.easymock;
+
+import static java.lang.annotation.ElementType.METHOD;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@Target({METHOD})
+public @interface IgnoreProp {
+
+}
Index: /home/jmares/workspace/easymock-propertyutils/src/main/java/com/stephenduncanjr/easymock/matcher/BeanProperty.java
===================================================================
--- /home/jmares/workspace/easymock-propertyutils/src/main/java/com/stephenduncanjr/easymock/matcher/BeanProperty.java	(revision 103)
+++ /home/jmares/workspace/easymock-propertyutils/src/main/java/com/stephenduncanjr/easymock/matcher/BeanProperty.java	(working copy)
@@ -65,7 +65,7 @@
 	 */
 	public void appendTo(final StringBuffer buffer)
 	{
-		buffer.append("propertyEq(");
+		buffer.append("propEq(");
 
 		for(final Entry<String, ?> entry : this.expectedProperties.entrySet())
 		{
