Returns the nparam value, and returns the default if it doesn't exist.
        If default is none, an exception will be raised instead.

        the returned parameter will have been specialized against the global context

def get(self, param, default=EMPTY):
        """
        Returns the nparam value, and returns the default if it doesn't exist.
        If default is none, an exception will be raised instead.

        the returned parameter will have been specialized against the global context
        """
        if not self.has(param):
            if default is not EMPTY:
                return default
            raise ParamNotFoundException("value for %s not found" % param)
        context_dict = copy.deepcopy(self.manifest.get_context_dict())
        for k, v in self.raw_dict.items():
            context_dict["%s:%s" % (self.feature_name, k)] = v
        cur_value = self.raw_dict[param]
        prev_value = None
        max_depth = 5
        # apply the context until doing so does not change the value
        while cur_value != prev_value and max_depth > 0:
            prev_value = cur_value
            try:
                cur_value = str(prev_value) % context_dict
            except KeyError:
                e = sys.exc_info()[1]
                key = e.args[0]
                if key.startswith('config:'):
                    missing_key = key.split(':')[1]
                    if self.manifest.inputs.is_input(missing_key):
                        val = self.manifest.inputs.get_input(missing_key)
                        context_dict[key] = val
                else:
                    logger.warn("Could not specialize %s! Error: %s" % (self.raw_dict[param], e))
                    return self.raw_dict[param]
            except ValueError:
                # this is an esoteric error, and this implementation
                # forces a terrible solution. Sorry.
                # using the standard escaping syntax in python is a mistake.
                # if a value has a "%" inside (e.g. a password), a ValueError
                # is raised, causing an issue
                return cur_value
            max_depth -= 1
        return cur_value