# Path: mongosql/util/inspect.py
# def pluck_kwargs_from(dct: Mapping, for_func: Callable, skip: Tuple[str] = ()) -> dict:
#     """ Analyze a function, pluck the arguments it needs from a dict """
#     defaults = get_function_defaults(for_func)
# 
#     # Get the values for these kwargs
#     kwargs = {k: dct.get(k, defaults[k])
#               for k in defaults.keys()
#               if k not in skip}
# 
#     # Done
#     return kwargs


from typing import *
from sqlalchemy.ext.declarative import DeclarativeMeta
from sqlalchemy.sql.elements import BinaryExpression
from .inspect import pluck_kwargs_from
                it would be possible to get almost any object through a series of nested joins!
        """
        super(MongoQuerySettingsDict, self).__init__()
        self.update({k: v
                     for k, v in locals().items()
                     if k not in {'__class__', 'self'}})
        # NOTE: before you say your BOO at me for using locals(), consider the following...
        # we have 20+ variables we have to pass to the update() function, and we have to make sure we've forgotten none.
        # At the same time, this method is only called ONCE per model, during the initialization phase.
        # All of this tells me that this is just the right situation to summon locals() to our assitance.
        # Otherwise, we'll have a large, long, ugly list of variables, and we'll have to keep it updated every time
        # there is a new setting in town.
        # Therefore, locals().

    def and_more(self, **settings):
        """ Copy the object and add more settings to it """
        return self.__class__(**{**self, **settings})

    @classmethod
    def pluck_from(cls, dict, skip=('max_items',)):
        """ Initialize the class by plucking kwargs from a dictionary.

            This is useful when you have a dict with configuration for multiple classes, and you want to initialize
            this one by getting only the keys you need.

            Example: pluck MongoQuerySettingsDict from a StrictCrudHelperSettingsDict.

            Args:
                skip: List of key names to skip when copying. Sometimes it just does not make sense to copy all values.
        """

# Path: mongosql/util/inspect.py
# def pluck_kwargs_from(dct: Mapping, for_func: Callable, skip: Tuple[str] = ()) -> dict:
#     """ Analyze a function, pluck the arguments it needs from a dict """
#     defaults = get_function_defaults(for_func)
# 
#     # Get the values for these kwargs
#     kwargs = {k: dct.get(k, defaults[k])
#               for k in defaults.keys()
#               if k not in skip}
# 
#     # Done
#     return kwargs


# Path: mongosql/util/settings_dict.py
from typing import *
from sqlalchemy.ext.declarative import DeclarativeMeta
from sqlalchemy.sql.elements import BinaryExpression
from .inspect import pluck_kwargs_from

                it would be possible to get almost any object through a series of nested joins!
        """
        super(MongoQuerySettingsDict, self).__init__()
        self.update({k: v
                     for k, v in locals().items()
                     if k not in {'__class__', 'self'}})
        # NOTE: before you say your BOO at me for using locals(), consider the following...
        # we have 20+ variables we have to pass to the update() function, and we have to make sure we've forgotten none.
        # At the same time, this method is only called ONCE per model, during the initialization phase.
        # All of this tells me that this is just the right situation to summon locals() to our assitance.
        # Otherwise, we'll have a large, long, ugly list of variables, and we'll have to keep it updated every time
        # there is a new setting in town.
        # Therefore, locals().

    def and_more(self, **settings):
        """ Copy the object and add more settings to it """
        return self.__class__(**{**self, **settings})

    @classmethod
    def pluck_from(cls, dict, skip=('max_items',)):
        """ Initialize the class by plucking kwargs from a dictionary.

            This is useful when you have a dict with configuration for multiple classes, and you want to initialize
            this one by getting only the keys you need.

            Example: pluck MongoQuerySettingsDict from a StrictCrudHelperSettingsDict.

            Args:
                skip: List of key names to skip when copying. Sometimes it just does not make sense to copy all values.
        """

        kwargs = pluck_kwargs_from(dict,