def METHOD_NAME(self, node):
    if node.keywords:
        self.update = True
        aliases = self.aliases[node.func]
        assert aliases, "at least one alias"
        # all aliases should have the same structural type...
        # call to self.handle_keywords raises an exception otherwise
        try:
            replacements = {}
            for func_alias in aliases:
                handle_special_calls(func_alias, node)
                if func_alias is None:  # aliasing computation failed
                    pass
                elif isinstance(func_alias, ast.Call):  # nested function
                    # func_alias looks like functools.partial(foo, a)
                    # so we reorder using alias for 'foo'
                    offset = len(func_alias.args) - 1
                    call = func_alias.args[0]
                    for func_alias in self.aliases[call]:
                        replacements = self.handle_keywords(func_alias,
                                                            node, offset)
                else:
                    replacements = self.handle_keywords(func_alias, node)
            # if we reach this point, we should have a replacement
            # candidate, or nothing structural typing issues would have
            # raised an exception in handle_keywords
            if replacements:
                for index, value in replacements.items():
                    node.args[index] = value
                node.keywords = []
        except KeyError as ve:
            err = ("function uses an unknown (or unsupported) keyword "
                   "argument `{}`".format(ve.args[0]))
            raise PythranSyntaxError(err, node)
    return self.generic_visit(node)