A module is a bag of functions. When we define a module, we are tying it to an atom. If we pass around the atom that references this module, then we can use it to call its functions.
For example, consider two types of greetings:
defmodule Hello do
def get_greeting do
"Hello, World!"
end
end
defmodule Hola do
def get_greeting do
"Hola, Mundo!"
end
end
And a generic greeting module that accepts a language module:
defmodule Greeting do
def say_hello(language_module) do
language_module.get_greeting
|> IO.puts
end
end
Greeting.say_hello(Hello) # => "Hello, World!"
Greeting.say_hello(Hola) # => "Hola, Mundo!"
The module reference that we pass in to Greeting.say_hello
can be used to
invoke the get_greeting
function.