docs: def from_config(cls, shelf, obj, **kwargs):
          """
          Construct a Recipe from a plain Python dictionary.
  
          Most of the directives only support named ingredients, specified as
          strings, and looked up on the shelf. But filters can be specified as
          objects.
  
          Additionally, each RecipeExtension can extract and handle data from the
          configuration.
          """
          def subdict(d, keys):
              new = {}
              for k in keys:
                  if k in d:
                      new[k] = d[k]
              return new
  
          core_kwargs = subdict(obj, recipe_schema['schema'].keys())
          core_kwargs = normalize_schema(recipe_schema, core_kwargs)
          core_kwargs['filters'] = [
              parse_condition(filter, shelf.Meta.select_from)
              if isinstance(filter, dict)
              else filter
              for filter in obj.get('filters', [])
          ]
          core_kwargs.update(kwargs)
          recipe = cls(shelf=shelf, **core_kwargs)
  
          # Now let extensions handle their own stuff
          for ext in recipe.recipe_extensions:
              additional_schema = getattr(ext, 'recipe_schema', None)
              if additional_schema is not None:
                  ext_data = subdict(obj, additional_schema.keys())
                  ext_data = normalize_dict(additional_schema, ext_data)
                  recipe = ext.from_config(ext_data)
          return recipe