Doesn't this need `T: Share`? (And can't it be `#[deriving]`'d?)