package com.yoursway.easymock.additions; import static org.easymock.EasyMock.reportMatcher; import org.easymock.IArgumentMatcher; public class Variable<T> { private final String name; private final Class<T> klass; public Variable(Class<T> klass) { this(klass, klass.getSimpleName()); } public Variable(Class<T> klass, String name) { if (name == null) throw new NullPointerException("name is null"); if (klass == null) throw new NullPointerException("klass is null"); this.name = name; this.klass = klass; } private T value; public T getValue() { return value; } public T extractValue() { T result = value; value = null; return result; } public void setValue(T value) { this.value = value; } public boolean isAssignableFrom(Object argument) { if (argument == null) return true; return klass.isAssignableFrom(argument.getClass()); } @Override public String toString() { return name; } public static <T> T anyObjectSavingInto(final Variable<T> variable) { reportMatcher(new IArgumentMatcher() { @SuppressWarnings("unchecked") public boolean matches(Object argument) { if (!variable.isAssignableFrom(argument)) throw new IllegalArgumentException("Wrong argument type: " + argument); variable.setValue((T) argument); return true; } public void appendTo(StringBuffer buffer) { buffer.append("anyObject"); } }); return null; } public static <T> T eq(final Variable<T> variable) { reportMatcher(new IArgumentMatcher() { public boolean matches(Object argument) { return argument == variable.getValue(); } public void appendTo(StringBuffer buffer) { buffer.append("eq(" + variable + ")"); } }); return null; } public static <T> Variable<T> create(Class<T> klass) { return new Variable<T>(klass); } }