README.md

# Erlang Decorators

An early implementation of python style decorators for Erlang.

# Quick start

Add the following to your rebar.config:
```erlang
{deps,
 [
  {decorators, "", {git, "git://github.com/chrisavl/erlang_decorators.git", {branch, "master"}}}
 ]
}.
```

Add `-compile([{parse_transform, decorators}]).` to any source file using
decorators, or add `{erl_opts, [{parse_transform, decorators}]}.` to your
rebar.config.


# Usage

There are 4 ways to decorate a function:
```erlang
-decorate(my_decorator). %% local function, no decorator data
-decorate({my_decorator, [{option, value}]}). %% local function, with data
-decorate({my_module, my_decorator}). %% external function, no decorator data
-decorate({my_module, my_decorator, [{option, value}]}). %% external function, with data
```

If no data/options is specified it defaults to the empty list.


Example:

```erlang
-module(mymod).
-compile([{parse_transform, decorators}]).

-export([demo/0]).

my_decorator(OriginalFun, OriginalArgs, _UnusedData = []) ->
    Start = erlang:now(),
    Result = apply(OriginalFun, OriginalArgs),
    io:format("call to ~p (args: ~p) took: ~f ms~n",
              [OriginalFun, OriginalArgs,
               timer:now_diff(now(), Start) / 1000]),
    Result.

%%-decorate({mymod, my_decorator}). % If decorator is an external call
-decorate(my_decorator). %% Since my_decorator is local, use shorthand notation
my_long_running_function(A, B) ->
    timer:sleep(100),
    A + B.

demo() ->
    3 = my_long_running_function(1, 2).
```