Just adding to what @axelson said, I really like the property that it doesn’t change anything. For instance looking at https://github.com/PragTob/benchee/blob/master/lib/benchee.ex
There’s one public run function and then just a bunch of delegates:
defdelegate init(), to: Benchee.Configuration
defdelegate init(config), to: Benchee.Configuration
defdelegate system(suite), to: Benchee.System
defdelegate benchmark(suite, name, function), to: Benchee.Benchmark
defdelegate benchmark(suite, name, function, printer), to: Benchee.Benchmark
defdelegate collect(suite), to: Benchee.Benchmark
defdelegate collect(suite, printer), to: Benchee.Benchmark
defdelegate statistics(suite), to: Benchee.Statistics
defdelegate load(suite), to: Benchee.ScenarioLoader
Makes it very clear that these are there for convenience and even links up the documentation 