Maybe the design can be made easier than this, but I reached the current one because of different ownership situations:

- `AnyRefExt`: implemented by `&Any`, `~Any`, `@Any` and `&mut Any` are the methods that just need a immutable reference to the trait object. It exists for the `is()` method, and for borrowing a immutable reference into it.
- `AnyMutRefExt`: implemented for `~Any` and `&mut Any`, and exists for borrowing a mutable reference into it.
- `AnyOwnExt`: only implemented for `~Any`, and exists for moving the value out of it again.

The design could probably be made trait-less if I could just `impl ~Any, &Any, ...` directly, but that is not possible because trait objects are not defined in libstd.

Combining is also not really possible, as you don't want to enable the content of a `&Any` and `@Any` to be borrowed mutably, or to enable moving out of them.

However, if DST lands, this might possible change, as presumably we could just do this:
~~~
impl Any {
    fn move(~self) {...}
    fn as_ref(&self) {...}
    fn as_mut(&mut self) {...}
}
~~~