# 3. wxRuby Dialogs Dialogs are a special class of window which are never automatically destroyed in wxWidgets. In C++ this does not cause a lot of management overhead for application programmers because of the possibility of static declaration of dialogs instances where the statically declared object is automatically destructed as execution leaves the declaration scope.
This kind of construct does not exist in Ruby where everything is dynamically allocated and garbage collection normally takes care of releasing objects that have gone *'out of scope'*. Like any non-owned, non-toplevel windows as discussed [here](02_lifecycles.md) this means dialogs should be explicitly destroyed in program code as appropriate like: ```ruby dlg = Wx::MessageDialog.new(parent, 'Select Yes or No', "Confirmation", Wx::YES_NO) if dlg.show_modal == Wx::ID_YES # do something end dlg.destroy ``` Although this is sometimes useful (for example in cases where a dialog is repeatedly used), most of the time this makes for somewhat bothersome programming. Luckily wxRuby has a solution for this. For all dialog classes (which includes Wx::Dialog and all it's derivatives, including user defined) the library defines a module function which is identically named to the dialog class in the same scope as where the dialog class has been first defined. This is similar to the module functions Ruby itself defines for the basic object classes like `Integer`, `String`, `Array`, `Hash` and such for the `Kernel` module.
These dialog *functors* accept the same arguments as the dialog class's constructor with the addition of a block. The *functor* will call the class constructor and pass the created dialog instance as argument to the block. After returning from the block the dialog instance will automatically be destroyed. So, using this approach we could write the previous example like: ```ruby Wx.MessageDialog(parent, 'Select Yes or No', "Confirmation", Wx::YES_NO) do |dlg| if dlg.show_modal == Wx::ID_YES # do something end end ``` Even better, if the only purpose is to show the dialog until closed without caring for the result we can leave out the block. In that case the *functor* will simply create the dialog instance, call `#show_modal` on it and destroy the instance after returning from `#show_modal` like: ```ruby Wx.MessageDialog(parent, 'Hello world!', 'Information', Wx::OK) ``` Regular dialog constructors are still usable for situations where the dialog instance should have a prolonged lifetime or where different modeless behavior is required.