Invalidation free copyto! depending on destination?

Hi. i have a type that is not a subtype of AbstractArray, but it has a notion of size:

#basically, vector + metadata
struct SingleParam{T,M}
  values::Vector{T} #same size as names

#a constructor that only accepts values. normally the constructor requires names and values to be the same size, but this code is only for demonstration purposes

function SingleParam(values::Vector{T})
  names = [string(i) for i in 1:length(values)]
  return SingleParam{T,Nothing)(names,values,nothing)

#same size as the underlying values vector
Base.size(param::SingleParam) = Base.size(param.values)
Base.broadcastable(param::SingleParam) = param.values
Base.BroadcastStyle(::Type{<:SingleParam}) = Broadcast.Style{SingleParam}()

and i want to perform implace operations over said struct:

p = SingleParam(rand(5))
p .= exp.(p) .+ sin.(p) .+ rand(5)

one way i found to do this is by defining copyto!

function copyto!(dest::SingleParam,src)

function copyto!(dest::SingleParam,SingleParam)
  return dest

but this does not appear to be the official way. as all the documentation does not seem to cover this case. furthermore, seems that this can cause troubles:

and it appears to be an ambiguous method (in conjunction with StaticArrays):

copyto!(dest::MyModule.SingleParam, src) in MyModule at C:\Users\user\.julia\dev\MyModule\src\database\params\SingleParam.jl:61, 
copyto!(dest, B::Base.Broadcast.Broadcasted{<:StaticArraysCore.StaticArrayStyle}) in StaticArrays at C:\Users\user\.julia\packages\StaticArrays\NOLon\src\broadcast.jl:65)

so my question is, what is the correct way to allow this type of implace operations?