package com.nominanuda.zen.obj.wrap; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import com.nominanuda.zen.obj.Obj; public class Wrap { public static final Wrap WF = new Wrap(); @SuppressWarnings("unchecked") public <T> T wrap(Obj o, Class<T> cl) { InvocationHandler h = new WrapperInvocationHandler(o, cl); return (T)Proxy.newProxyInstance(cl.getClassLoader(), new Class[] { cl }, h); } public <T> T wrap(Class<T> cl) { return wrap(null, cl); } public <T extends ObjWrapper> T clone(T obj, Class<T> cl) { return wrap(obj.unwrap().copyCast(), cl); } }