The reason that this returns an `Option` is because there may not be a pointer inside here. Whenever you call `take` you must transfer ownership, zeroing out the previous location.

This implementation allows unsafely aliasing data. You shouldn't need to allocate here:

```rust
pub fn take(&mut self) -> Option<~T> {
    let ptr = unsafe { intrinsics::volatile_load(&self.ptr) };
    if ptr.is_null() { return None; }
    unsafe { intrinsics::volatile_store(&self.ptr, 0 as *mut T); }
    Some(unsafe { cast::transmute(ptr) })
}
```