import static com.github.forax.proxy2.MethodBuilder.methodBuilder;
import static java.lang.invoke.MethodHandles.publicLookup;

import java.io.PrintStream;
import java.lang.invoke.CallSite;
import java.lang.invoke.ConstantCallSite;
import java.lang.invoke.MethodHandle;

import com.github.forax.proxy2.Proxy2;
import com.github.forax.proxy2.Proxy2.ProxyContext;
import com.github.forax.proxy2.Proxy2.ProxyFactory;
import com.github.forax.proxy2.Proxy2.ProxyHandler;

public interface Print {
  public void println(String message);
  
  public static void main(String[] args) {
    ProxyFactory<Print> factory = Proxy2.createAnonymousProxyFactory(Print.class, new ProxyHandler.Default() { 
      @Override
      public CallSite bootstrap(ProxyContext context) throws Throwable {
        MethodHandle target =
            methodBuilder(context.type())
              .dropFirst()
              .insertAt(0, PrintStream.class, System.out)
              .unreflect(publicLookup(), PrintStream.class.getMethod("println", String.class));
        return new ConstantCallSite(target);
      }
    });
    
    Print hello = factory.create();
    hello.println("hello proxy2");
  }
}