Consider a simple solver type:

```
using Parameters: @with_kw
@with_kw struct Param
mean = 0.
variance = 1.
end
struct Solver
params::Dict{Symbol,Param}
function Solver(params...)
new(Dict(params...))
end
end
```

Based on this interface, the user can construct solvers like the following:

```
Solver(:var1=>Param(mean=2.), :var2=>Param(variance=3.))
```

The idea is that for each variable of the problem one can specify a set of parameters that will trigger a different method. The code is working fine, but I guess there is a cleaner way of achieving the same result without this ugly `Param`

type in front of the parameters?

```
Solver(:var1=>(mean=2.), :var2=>(variance=3.), :var3=>(mean=1.,var=2.))
```

Do you have suggestions on how to refactor the code to make it look nicer? The actual implementation can be found here: https://github.com/juliohm/GeoStats.jl/blob/master/src/kriging_solver.jl

More generally, is there any effort in a package to generalize this process? Are macros useful here?