You can use the concrete subtyping feature in ReusePattern.jl for this purpose, i.e.:
@quasiabstract struct Controller
field1
field2
etc.
end
@quasiabstract struct NewController <: Controller
field3
etc.
end
function simulate(c::Controller)
println(c.field1, c.field2)
end
conctroller = NewController(arg1, arg2, arg3)
# The following will surely work (as long as you use `@quasiabstract` to subtype `Controller`)
simulate(controller)