suppose an abstract type R has several concrete children types, say S and T, i.e. S <: R and S <: T.  Now, a function fun is overloaded on every child of R like:
function fun(x::S)
   @assert common_check(x)
  return S_specific(x)
end
function fun(x::T)
   @assert common_check(x)
  return T_specific(x)
end
It would be nice to be able to refactor common_check(), in the following imaginative manner:
function fun(x::R)
  @assert common_check(x)
  # ??? then, how to dispatch???
end
function fun(x::S)
  return S_specific(x)
end
function fun(x::T)
  return T_specific(x)
end
how could it be done??? the problem is: if I call fun(::S) or fun(::T), fun(::R) would not be called at all. Thanks.