def METHOD_NAME(self, terms, variables=None, **kwargs):
    number_chars = string.digits
    lower_chars = string.ascii_lowercase
    upper_chars = string.ascii_uppercase
    special_chars = string.punctuation
    random_generator = random.SystemRandom()
    self.set_options(var_options=variables, direct=kwargs)
    length = self.get_option("length")
    base64_flag = self.get_option("base64")
    override_all = self.get_option("override_all")
    values = ""
    available_chars_set = ""
    if override_all:
        # Override all the values
        available_chars_set = override_all
    else:
        upper = self.get_option("upper")
        lower = self.get_option("lower")
        numbers = self.get_option("numbers")
        special = self.get_option("special")
        override_special = self.get_option("override_special")
        if override_special:
            special_chars = override_special
        if upper:
            available_chars_set += upper_chars
        if lower:
            available_chars_set += lower_chars
        if numbers:
            available_chars_set += number_chars
        if special:
            available_chars_set += special_chars
        mapping = {
            "min_numeric": number_chars,
            "min_lower": lower_chars,
            "min_upper": upper_chars,
            "min_special": special_chars,
        }
        for m in mapping:
            if self.get_option(m):
                values += self.get_random(random_generator, mapping[m], self.get_option(m))
    remaining_pass_len = length - len(values)
    values += self.get_random(random_generator, available_chars_set, remaining_pass_len)
    # Get pseudo randomization
    shuffled_values = list(values)
    # Randomize the order
    random.shuffle(shuffled_values)
    if base64_flag:
        return [self.b64encode("".join(shuffled_values))]
    return ["".join(shuffled_values)]