package com.googlecode.totallylazy.proxy;
import com.googlecode.totallylazy.functions.Function1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import static com.googlecode.totallylazy.proxy.Generics.getGenericSuperclassType;
import static com.googlecode.totallylazy.proxy.Proxy.proxy;
public abstract class CallOn<T, S> implements Function1<T,S>, InvocationHandler {
private MethodInvocation<T,S> invocation;
protected final T call, instance;
protected CallOn() {
Class<T> aClass = getGenericSuperclassType(this.getClass(), 0);
call = instance = proxy(aClass, this);
}
public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable {
invocation = new MethodInvocation<T,S>(method, arguments);
return null;
}
public S call(T t) throws Exception {
return invocation.call(t);
}
public MethodInvocation<T,S> invocation() {
return invocation;
}
}