private Object wrap(Object obj) {
        List<Class> ifaceList = new ArrayList<Class>();
        for (Class iface: obj.getClass().getInterfaces()) {
            if (iface.isAnnotationPresent(Replayable.class))
                ifaceList.add(iface);
        }
        Class[] ifaces = ifaceList.toArray(new Class[0]);

        boolean isReplayClass = false;
        if (obj.getClass().isAnnotationPresent(Replayable.class))
            isReplayClass = true;

        if (ifaces.length > 0 || isReplayClass) {
            Enhancer e = new Enhancer();

            if (ifaces.length > 0)
                e.setInterfaces(ifaces);

            if (isReplayClass)
                e.setSuperclass(obj.getClass());

            e.setCallback(new Interceptor(obj));

            Object proxy = e.create();
            _pool.putProxy(obj, proxy);

            return proxy;
        }

        return obj;
    }