Is it necessary to have a public visibility for this? In general, by default, I think of all methods as private unless they are absolutely necessary in the public interface to allow things to work.

In this case the method is kind of a command *and* query method. It does some work and returns the `@dsl_module`. You can't call it without that extra work being performed.

What I might suggest is either having an `#initialize_dsl_module` method that sets up the state of the object, or have a `#dsl_module` method that initializes the module and does all the work adding the dsl methods one time and memorizes it in `@dsl_module`.