def cook(grass, parameters = {})
      # grass.g.mapsets '-p'
      # current_mapset = output.lines.last.split.first

      # Leave planning/checking if doable to the caller; not done here:
      # unless doable? GrassCookbook.available_data(grass, parameters)
      #   raise "Requirements for #{@id} not fulfilled"
      # end

      # Also not done here:
      # if done? GrassCookbook.available_data(grass, parameters)
      #   return
      # end

      args = parameters.values_at(*@required_parameters)
      # @process.call grass, *args
      # grass.session &@process, arguments: args
      # TODO: support in GrassGis for injecting/replacing locals
      grass.define_singleton_method(:parameters) { @parameters }
      grass.instance_exec *args, &@process
    end
def cook(grass, parameters = {})
      # grass.g.mapsets '-p'
      # current_mapset = output.lines.last.split.first

      # Leave planning/checking if doable to the caller; not done here:
      # unless doable? GrassCookbook.available_data(grass, parameters)
      #   raise "Requirements for #{@id} not fulfilled"
      # end

      # Also not done here:
      # if done? GrassCookbook.available_data(grass, parameters)
      #   return
      # end

      args = parameters.values_at(*@required_parameters)
      # @process.call grass, *args
      # grass.session &@process, arguments: args
      # TODO: support in GrassGis for injecting/replacing locals
      grass.define_singleton_method(:parameters) { @parameters }
      grass.instance_exec *args, &@process
    end
Execute the recipe with given parameters # TODO: mapset PATH