docs: def common_criteria(**common):
      """
      Wrap a function to always call with the given ``common`` named parameters.
  
      :property common: criteria common to your function call
      :return: decorator function
      :rtype: :class:`function`
  
      .. doctest::
  
          >>> import cqparts
          >>> from cqparts.search import register, search, find
          >>> from cqparts.search import common_criteria
  
          >>> # Somebody elses (boring) library may register with...
          >>> @register(a='one', b='two')
          ... class BoringThing(cqparts.Part):
          ...     pass
  
          >>> # But your library is awesome; only registering with unique criteria...
          >>> lib_criteria = {
          ...     'author': 'your_name',
          ...     'libname': 'awesome_things',
          ... }
  
          >>> awesome_register = common_criteria(**lib_criteria)(register)
  
          >>> @awesome_register(a='one', b='two')  # identical to BoringThing
          ... class AwesomeThing(cqparts.Part):
          ...     pass
  
          >>> # So lets try a search
          >>> len(search(a='one', b='two')) # doctest: +SKIP
          2
          >>> # oops, that returned both classes
  
          >>> # To narrow it down, we add something unique:
          >>> len(search(a='one', b='two', libname='awesome_things'))  # finds only yours # doctest: +SKIP
          1
  
          >>> # or, we could use common_criteria again...
          >>> awesome_search = common_criteria(**lib_criteria)(search)
          >>> awesome_find = common_criteria(**lib_criteria)(find)
          >>> len(awesome_search(a='one', b='two')) # doctest: +SKIP
          1
          >>> awesome_find(a='one', b='two').__name__
          'AwesomeThing'
  
      A good universal way to apply unique criteria is with
  
      .. testcode::
  
          import cadquery, cqparts
          from cqparts.search import register, common_criteria
          _register = common_criteria(module=__name__)(register)
  
          @_register(shape='cube', scale='unit')
          class Cube(cqparts.Part):
              # just an example...
              def make(self):
                  return cadquery.Workplane('XY').box(1, 1, 1)
  
      """
      def decorator(func):
          def inner(*args, **kwargs):
              merged_kwargs = copy(common)
              merged_kwargs.update(kwargs)
              return func(*args, **merged_kwargs)
          return inner
      return decorator