I had attempted to the following usage:

iex(1)> defmodule MyApp.Calculator do
...(1)>   @behaviour __MODULE__
...(1)>   @callback add(integer(), integer()) :: integer()
...(1)>   def add(x, y), do: x + y
...(1)> end
warning: behaviour MyApp.Calculator is undefined

After some discussion with Muskala (micmus)/Milde (lostkobrakai) it seemed 
that use case may be possibly be valid. That is, the ability to define and 
implement a behaviour in the same module. 

For my part, I had wanted to locate the documentation and @callback along 
with the default implementation. I have been diligently factoring my 
modules into separate files per 
http://blog.plataformatec.com.br/2015/10/mocks-and-explicit-contracts/. 
With this approach, however, I am finding that there has been a bit of an 
explosion with the number of files.

It was suggested that the following is considered an idiomatic way to 
associate doc with an implementation:

defmodule MyApp.Calculator do
  @callback add(integer(), integer()) :: integer()

  defmacro __using__ do
    quote do
      def add(x, y), do: x + y
    end
  end
end

defmodule MyApp.CalculatorImpl do
  use MyApp.Calculator
  @behaviour MyApp.Calculator
end

But here too I need to define a second file for the default implementation 
(assuming one module definition per file is desired). I find that there is 
also a bit of additional complexity here which makes it slightly more 
difficult to reason about.

Note: Related? 
https://groups.google.com/forum/#!topic/elixir-lang-core/8jrwjECcFTw

Jack

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/e246a0c6-17fe-4403-8d2d-165f934e9be0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to