macro_rules! cast_impl {
($e:ident :: $v:ident ($u:ty)) => { ... };
(impl($($p:tt)*) $e:ident ($($ep:tt)*) :: $v:ident ($u:ty)) => { ... };
(impl($($p:tt)*) $t:ty) => { ... };
($t:ty) => { ... };
($(impl($($p:tt)*))? ($bot:ty) <: ($($mid:ty),*) <: ($top:ty)) => { ... };
}