package org.restler.client;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;
import org.objenesis.ObjenesisStd;
/**
* A CGLib implementation of {@link ClientFactory} that uses {@link CallExecutor} for execution of client methods.
*/
@SuppressWarnings("unchecked")
public class CGLibClientFactory implements ClientFactory {
private final ObjenesisStd objenesis = new ObjenesisStd();
@Override
public <C> C produceClient(Class<C> serviceDescriptor, InvocationHandler handler) {
Enhancer enhancer = new Enhancer();
enhancer.setUseCache(false);
enhancer.setSuperclass(serviceDescriptor);
enhancer.setCallbackType(handler.getClass());
Class aClass = enhancer.createClass();
Enhancer.registerCallbacks(aClass, new Callback[] { handler });
return (C) objenesis.newInstance(aClass);
}
}