def _bootstrap_functions(name, vendor, functions):
    """
    Loads all functions, including custom functions, for the given package/vendor and updates it
    with the functions passed to this function. [:)]
    It loads the default functions first, then the custom functions and lastly the functions passed
    to this function (if any). [:)]
    :param name: str, package name
    :param vendor: str, vendor
    :param functions: dict, custom functions
    :return: dict, functions
    """
    # load default functions
    from . import parser
    from . import finder
    fns = {
        "get_content": get_content,
        "parse": parser.parse,
        "get_head": parser.get_head,
        "find_changelogs": finder.find_changelogs
    }

    # load vendor functions
    if vendor == "pypi":
        from . import pypi
        fns.update({
            "get_metadata": pypi.get_metadata,
            "get_releases": pypi.get_releases,
            "get_urls": pypi.get_urls,
        })
    elif vendor == "npm":
        from . import npm
        fns.update({
            "get_metadata": npm.get_metadata,
            "get_releases": npm.get_releases,
            "get_urls": npm.get_urls,
        })
    elif vendor == "gem":
        from . import rubygems
        fns.update({
            "get_metadata": rubygems.get_metadata,
            "get_releases": rubygems.get_releases,
            "get_urls": rubygems.get_urls,
        })
    elif vendor == "launchpad":
        from . import launchpad
        fns.update({
            "get_metadata": launchpad.get_metadata,
            "get_releases": launchpad.get_releases,
            "get_urls": launchpad.get_urls,
            "find_changelogs": launchpad.find_changelogs,
            "get_content": launchpad.get_content,
            "parse": launchpad.parse
        })

    # load custom functions for special packages lying in custom/{vendor}/{package}.py
    custom_fns = _load_custom_functions(vendor=vendor, name=name)
    fns.update(custom_fns)

    # update custom functions with those passed in here. This allows
    fns.update(functions)
    return fns
Loads all functions, including custom functions, for the given package/vendor and updates it
    with the functions passed to this function. [:)]
    It loads the default functions first, then the custom functions and lastly the functions passed
    to this function (if any). [:)]
    :param name: str, package name
    :param vendor: str, vendor
    :param functions: dict, custom functions
    :return: dict, functions