Add documentation
Use built-in traits for boilerplate functions