public Object execute(IEval aEval, IContext aCtx, Object[] aArgs)
    throws CommandException
    {
        try
        {
            Object[] lArgs = aArgs;

            if (argList != null)
            {
                lArgs = argList.guard(aArgs, aCtx);
            }
            
            if(argMapping != null)
            {
                lArgs = argMapping.map(aEval, aCtx, lArgs);
            }
            
            Object lResult = method.invoke(instance, lArgs);

            if(resultMapping != null)
            {
                resultMapping.map(lResult, aCtx);
            }

            return lResult;
        }
        catch (IllegalAccessException e)
        {
            throw new CommandException(String.format("Command '%s' illegal access exception.\n%s", aArgs[0], CmdUtil.concatExceptionMessages(e)));
        }
        catch (InvocationTargetException e)
        {
            // The internal invocation threw an exception, we have to fetch the original exception.
            // We don't add our own message at this level, this handler should be transparent because it does
            // not add extra information.
            Throwable lOrigExc = e.getTargetException();
            throw new CommandException(CmdUtil.concatExceptionMessages(lOrigExc));
        }
        catch (ArgMappingException e)
        {
            throw new CommandException(String.format("Command '%s' parameter mapping exception.\n%s", aArgs[0], CmdUtil.concatExceptionMessages(e)));
        }
        catch (ArgSpecException e)
        {
            final String lMsg = String.format("Command '%s' was invoked with incorrect arguments.\n%s", aArgs[0], CmdUtil.concatExceptionMessages(e));
            throw new CommandException(lMsg);
        }
        catch(IllegalArgumentException e)
        {
            final Class lClass = method.getDeclaringClass();
            final String lMsg = String.format("Command '%s' internal error. One of the parameters in method '%s' in class '%s' has a wrong type.", aArgs[0], method.getName(), lClass.getName());
            throw new CommandException(lMsg);
        }
        catch (ResultMappingException e)
        {
            throw new CommandException(String.format("Command '%s' the result could not be bound to the context.\n%s", aArgs[0], CmdUtil.concatExceptionMessages(e)));
        }
    }