README.md

# Methods

Elixir needed method call syntax, so I added it.

```elixir
  defmodule Rect do
    defstruct [width: 0, height: 0]

    def area(self) do
      self.width * self.height
    end
  end 

  defmodule Main do
    use Methods

    def main do
      r1 = %Rect{width: 10, height: 10}
      area = r1..area()
    end
  end
```


Yes, I stole the ".." operator. It still works for constructing ranges as long
as you don't put a function call on the right side.

I'd rather have stolen the "." operator, but the compiler won't let me. I guess
once everyone agrees this is a good idea it can get added as improved Elixir
syntax.

## Wait, why?

Method syntax has two big wins over just calling functions:

- Dynamic dispatch. You can loop over a list of shapes and call "shape..area()" on
each one. For squares, you get Square.area(), for circles you get Circle.area().
- Reduced verbosity or namespace pollution. You don't need to chose between
"import Square" and typing "Square.area", structs already know where their
methods are.

There are disadvantages:

- Dynamic dispatch is slower and can't be optimized, especially since the
compiler and runtime don't expect it.
- Error messages might be terrible.
- This particular implementation breaks constructing perfectly reasonable ranges
like "1..sqrt(n)".

## Installation

```elixir
def deps do
  [
    {:methods, "~> 0.1.0"}
  ]
end
```

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at <https://hexdocs.pm/methods>.