pub trait Edit: Any + Debug {
// Required methods
fn label(&self) -> &str;
fn files(&self) -> Vec<PathBuf>;
fn apply(&mut self, files: &mut Files) -> Result<(), DocError>;
fn inverse(&self) -> Box<dyn Edit>;
// Provided methods
fn merge(&self, _next: &dyn Edit) -> Option<Box<dyn Edit>> { ... }
fn caret(&self) -> Option<Caret> { ... }
}