prompts the user for a value, and saves it to either the target or
        source manifest (whichever is appropriate for the phase)

        this method takes will default to the original value passed by
        the user in the case one exists. e.g. if a user already
        answered 'yes' to a question, it will use 'yes' as the default
        vs the one passed into this method.

def _prompt_value(self, key, prompt_string, default=None, only_if_empty=True):
        """prompts the user for a value, and saves it to either the target or
        source manifest (whichever is appropriate for the phase)

        this method takes will default to the original value passed by
        the user in the case one exists. e.g. if a user already
        answered 'yes' to a question, it will use 'yes' as the default
        vs the one passed into this method.
        """
        main_manifest = self.target or self.source

        if only_if_empty and main_manifest.has(key):
            return main_manifest.get(key)

        prompt_default = default
        if self.source and self.source.has(key):
            prompt_default = self.source.get(key)

        main_manifest.set(key,
                          lib.prompt(prompt_string,
                                     default=prompt_default))