#![feature(box_syntax)] use std::sync::Arc; pub struct Session<K, V> { key: K, store: Arc<Box<SessionStore<K, V>>> } impl<K, V> Session<K, V> { fn new(key: K, store: Box<SessionStore<K, V>>) -> Session<K, V> { Session { key: key, store: Arc::new(store) } } } trait SessionStore<K, V>: Clone + Copy + Sync { fn select_session(&mut self, key: K) -> Session<K, V> { Session::new(key, box self.clone()) }