@Test
    public void testEndUserApi() throws JFKException{
	// create the dummy object
	DummyClass dummy = new DummyClass();
	
	// now get the function
	IFunctionBuilder builder = JFK.getFunctionBuilder();
	IFunction function = builder.bindFunction( dummy, "hello" );
	
	// execute the function
	String result = (String) function.executeCall( null );
	
	// test the result
	if( ! dummy.resultString.equals(result) )
	    fail("Function invocation does not result!");
	
	// now get another function
	IFunction function2 = builder.bindFunction(dummy, "double" );
	
	if( function.equals(function2) )
	    fail("Two functions should not be equale with different names!");
	
	Double d1 = new Double(10.5);
	Double d2 = (Double) function2.executeCall( new Object[]{ d1 } );
	if( (d1.doubleValue() * 2) != (d2.doubleValue() ) )
	    fail("Return value is not the same! (" + d1.doubleValue() + " vs " + d2.doubleValue() + ")");
	
	
	// test arity
	try{
	    function2 = builder.bindFunction(dummy, "string2");
	    function2.executeCall(null);
	}catch(JFKException e){
	    e.printStackTrace();
	}
	
	
	// another function
	int value = 10;
	IFunction function3 = builder.bindFunction(dummy, "string");
	if( function3.equals(function2) || function3.equals(function) )
	    fail("A function that should not be the same of a previous one!");
	
	result = (String) function3.executeCall( new Object[]{ value } );
	if( ! result.equals( dummy.resultString + value ) )
	    fail("Result value for string composition is wrong!");
	
	
	// test arity
	try{
	    function3 = builder.bindFunction(dummy, "string2");
	    function3.executeCall(new Object[]{ value });
	    fail("Method call bad arity check passed!");
	}catch(JFKException e){
	    e.printStackTrace();
	}
	
	
	// test function parameters
	try{
	    function3 = builder.bindFunction(dummy, "string2");
	    function3.executeCall(new Object[]{ new String("A"), new String("B") });
	    fail("Method call parameter check passed!");
	}catch(JFKException e){
	    e.printStackTrace();
	}
	
	
    }