Skeleton(JMSRemoteSystem remoteSystem, JMSRemoteRef ref, Object target) {
        this.remoteSystem = remoteSystem;
        try {
            this.target = target;
            Class<?> clazz = this.target.getClass();
            if (CGLibProxyAdapter.isProxyClass(ref.getProxy().getClass())) {
                for (Method method : clazz.getMethods()) {
                    if (method.getDeclaringClass() == Object.class) {
                        continue;
                    }
                    //                    System.out.println("Class: " + clazz.getName() + " adding method: " + method.toGenericString());

                    String sig = JMSRemoteSystem.signature(method);
                    methods.put(sig, clazz.getMethod(method.getName(), method.getParameterTypes()));
                }
            } else {
                for (Class<?> intf : ref.getInterfaces()) {
                    for (Method method : intf.getMethods()) {
                        //                        System.out.println("Class: " + clazz.getName() + " adding method: " + method.toGenericString());

                        String sig = JMSRemoteSystem.signature(method);
                        methods.put(sig, intf.getMethod(method.getName(), method.getParameterTypes()));
                    }
                }
            }
        } catch (NoSuchMethodException e) {
            throw new IllegalArgumentException("target should implement all of the interfaces provided", e);
        }
    }