pub struct Post { state: Option>, content: String, } // ANCHOR: here impl Post { // --snip-- // ANCHOR_END: here pub fn new() -> Post { Post { state: Some(Box::new(Draft {})), content: String::new(), } } pub fn add_text(&mut self, text: &str) { self.content.push_str(text); } pub fn content(&self) -> &str { "" } // ANCHOR: here pub fn request_review(&mut self) { if let Some(s) = self.state.take() { self.state = Some(s.request_review()) } } } trait State { fn request_review(self: Box) -> Box; } struct Draft {} impl State for Draft { fn request_review(self: Box) -> Box { Box::new(PendingReview {}) } } struct PendingReview {} impl State for PendingReview { fn request_review(self: Box) -> Box { self } } // ANCHOR_END: here