<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_config(filepath=None, default_loader=None, on_missing=None):
 """Get a dict for the current birding configuration. The resulting dictionary is fully populated with defaults, such that all valid keys will resolve to valid values. Invalid and extra values in the configuration result in an exception. See :ref:`config` (module-level docstring) for discussion on how birding configuration works, including filepath loading. Note that a non-default filepath set via env results in a :py:exc:`OSError` when the file is missing, but the default filepath is ignored when missing. This function caches its return values as to only parse configuration once per set of inputs. As such, treat the resulting dictionary as read-only as not to accidentally write values which will be seen by other handles of the dictionary. Args: filepath (str):
 path to birding configuration YAML file. default_loader (callable):
 callable which returns file descriptor with YAML data of default configuration values on_missing (callable):
 callback to call when file is missing. Returns: dict: dict of current birding configuration; treat as read-only. """

    # Handle cache lookup explicitly in order to support keyword arguments.
    cache_key = (filepath, default_loader, on_missing)
    if CACHE.get(cache_key) is not None:
        return CACHE.get(cache_key)

    logger = logging.getLogger('birding')

    if filepath is None:
        filepath = BIRDING_CONF
    if default_loader is None:
        default_loader = get_defaults_file
    if on_missing is None:
        on_missing = logger.info

    logger.info(
        'Looking for configuration file: {}'.format(os.path.abspath(filepath)))
    if not os.path.exists(filepath):
        # Log a message if filepath is default; raise error if not default.
        on_missing('No {} configuration file found.'.format(filepath))
        if filepath != BIRDING_CONF_DEFAULT:
            # Stat the missing file to result in OSError.
            os.stat(filepath)

    config = yaml.safe_load(default_loader())
    tv.validate(SCHEMA, config)
    if os.path.exists(filepath):
        file_config = yaml.safe_load(open(filepath))
        if file_config:
            config = overlay(file_config, config)
            tv.validate(SCHEMA, config)

    CACHE.put(cache_key, config)

    return config