pub trait ScriptContentProvider<T> {
// Required methods
fn load(&mut self, path: &str) -> Result<Option<T>, Box<dyn Error>>;
fn join_paths(
&self,
parent: &str,
relative: &str,
) -> Result<String, Box<dyn Error>>;
// Provided methods
fn unpack_load(
&mut self,
path: &str,
) -> Result<Vec<ScriptContent<T>>, Box<dyn Error>> { ... }
fn sanitize_path(&self, path: &str) -> Result<String, Box<dyn Error>> { ... }
}