'Invoke this SpackCommand.
Args:
argv (list of str): command line arguments.
Keyword Args:
color (optional bool): force-disable or force-enable color
Returns:
(str, str): output and error as a strings
On return, if ``fail_on_error`` is False, return value of comman
is set in ``returncode`` property.  Otherwise, raise an error.'

def __call__(self, *argv, **kwargs):

    (args, unknown) = self.parser.parse_known_args(([self.command_name] + list(argv)))
    (out, err) = (sys.stdout, sys.stderr)
    (ofd, ofn) = tempfile.mkstemp()
    (efd, efn) = tempfile.mkstemp()
    try:
        sys.stdout = open(ofn, 'w')
        sys.stderr = open(efn, 'w')
        self.returncode = _invoke_spack_command(self.command, self.parser, args, unknown)
    except SystemExit as e:
        self.returncode = e.code
    finally:
        sys.stdout.flush()
        sys.stdout.close()
        sys.stderr.flush()
        sys.stderr.close()
        (sys.stdout, sys.stderr) = (out, err)
        return_out = open(ofn).read()
        return_err = open(efn).read()
        os.unlink(ofn)
        os.unlink(efn)
    if (self.fail_on_error and (self.returncode != 0)):
        raise SpackCommandError(('Command    exited    with    code    %d:    %s(%s)' % (self.returncode, self.command_name, ',    '.join((("'%s'" % a) for a in argv)))))
    return (return_out, return_err)
