Awesome
erlang_decorators
This code implenets decorators for erlang.
Usage
Internal
First of all you need set {parser_transform, decorators}
compile option.
-compile([{parse_transform, decorators}]).
and then specify decorate
attribute before funcion definition.
-decorate(DecoratorSpec).
my_function(...) -> ... .
DecoratorSpec:
{Module :: module(), Fun :: atom()}
- will callModule:Fun(F, Args)
, whereF
is function with arity 1, which takes a list as argumets and apply this list to original function, andArgs
is a decorated function arguments list.{Module :: module(), Fun :: atom(), Args :: [any()]}
- same as previous, but you can specify aditional decorator function arguments. `Module:Fun(F, Args, Arg1, Arg2, ...) will be called.{Module :: module(), Fun :: atom(), Args :: [any()], verbose}
- if you specifyverbose
option, the third decorator function argument will be an a tuple of original function name and code line:{FuncName :: atom(), Line :: non_neg_integer()}
. `Module:Fun(F, Args, {FunName, Line}, Arg1, Arg2, ...) will be called.
External
You can also specify decorators from outside of module at compile time.
First of all you must tell compiler to use decorators parse_transform globaly.
And then specify compile decorate
option, which describes how to decorate modules functions.
Syntax:
{decorate,
[
{Module :: module(),
[
{{Fun :: atom(), Arity :: non_neg_integer() | '*'} | '*',
[DecoratorSpec, ...]},
...
],
...
]}
Examples
Internal
-module(my_module).
-compile([{parse_transform, decorators}]).
%% decorator
-export([
log_result/2
]).
%% Decorated function
-export([
foo/1
]).
log_result(Fun, Args) ->
Result = Fun(Args),
io:format("Result is: ~p", [Result]),
Result.
-decorate({?MODULE, log_result}).
foo(Bar) ->
Bar*100.
External
rebar.config
{erl_opts,
[
{parse_transform, decorators},
{decorate,
[
{my_module1,
[
{{fun1, 0}, [{my_decorators, decorator1}]},
{{fun2, 0}, [
{my_decorators, decorator1},
{my_decorators, decorator2}
]},
]},
{my_module2,
[
{{fun2, 0}, [
{my_decorators, decorator3, [tag]},
{my_decorators, decorator4, [tag], verbose}
]}
]}
]},
...
]}.