# Deco - Minimalist Function Decorators for Elixir.
<a href="https://travis-ci.org/vic/deco"><img src="https://travis-ci.org/vic/deco.svg"></a>
[hexdocs](https://hexdocs.pm/deco).
Yes, yet another package for decorating elixir functions :).
However, `deco`'s [core is minimalist]() in comparission to others,
uses much less magic, does not overrides anything like `Kernel.def`
nor any operator.
`deco` has only one macro, decorators themselves are just plain functions
`Macro.t() -> Macro.t()`, and imposes no run-time overhead because
function decoration is performed at compile-time.
## Usage
The syntax is `deco DECORATORS in FORM` where decorators is a tuple of
one or more decorators, and form is tipically a function definition.
`decorators` are just plain functions you write that take the AST of
`FORM` and just return a modified AST of it. The [`Deco`]() module has
some convenience functions for updating the AST.
Since `deco` runs at compile time, you cannot use functions being
defined in the same module that is using `deco`. Normally it's better
to define your decorators on a separate module.
The following example [taken from a test]() decorates a function with
a `Logger` tracer that will print the arguments given before applying
to the original function, and the its final result.
```elixir
deco { Example.trace() } in
def foo(x) do
x
end
```
Decorators can take arguments, the AST will be prepended to the list
of arguments given by you.
For example, [Deco.pipe_result]() will as it name implies just pipe the
function return value into the code given as argument to the decorator.
```elixir
deco { Deco.pipe_result(to_string) } in
def foo(x) when is_atom(x) do
x
end
```
Decorators can be composed, the one at the end will take the original
AST and produce a new one for the one on top of it.
```elixir
deco {
Deco.pipe_result(String.capitalize()),
Deco.pipe_result(String.reverse()),
Deco.pipe_result(to_string)
} in
def foo(x) do
x
end
foo(:john)
=> "Nhoj
```
For more examples, see the [tests]() and the [use the source, Luke]()
## Installation
```elixir
def deps do
[
{:deco, "~> 0.1"}
]
end
```