protected Object newDynamicProxy(TypeToken typeToken, final ITestContext iTestContext) {
        final Class<?> clazz = typeToken.getRawType();
        final Map<String, Object> methodResults = new HashMap<String, Object>();

        Object res = Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[] { clazz }, new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                String mSignature = ITestUtils.getMethodSingnature(method, true);
                if ( methodResults.containsKey(mSignature) ) {
                    return methodResults.get(mSignature);
                }
                throw new ITestMethodExecutionException("Implementation of " + clazz.getName() + "." + mSignature + " not provided", null);
            }
        });

        TypeToken t = typeToken;
        do {
            for (Method m : t.getRawType().getDeclaredMethods()) {
                if ( !Modifier.isStatic(m.getModifiers()) ) {
                    TypeToken mType = typeToken.resolveType(m.getGenericReturnType());
                    String signature = ITestUtils.getMethodSingnature(m, true);
                    ITestParamState iTestState = iTestContext.getCurrentParam();
                    ITestParamState mITestState = iTestState == null ? null : iTestState.getElement(signature);
                    if ( null == mITestState ) {
                        signature = ITestUtils.getMethodSingnature(m, false);
                    }
                    fillMethod(mType.getType(), m, res, signature, iTestContext, methodResults);
                }
            }
        } while (t.getRawType().getSuperclass() != null && (t = t.getSupertype(t.getRawType().getSuperclass())) != null);

        return res;
    }