Skip to content

Latest commit

 

History

History
92 lines (66 loc) · 2.17 KB

README.markdown

File metadata and controls

92 lines (66 loc) · 2.17 KB

Mixer

Build Status

Mix in functions from other modules.

Concept

The original motivation for this parse transform was to permit reuse of functions implementing common logic for tasks such as signature verification and authorization across multiple webmachine resources. It allows you to provide shared implementations of behavior callbacks without copy&pasting.

Examples

foo.erl:

    -module(foo).

    -export([doit/0, doit/1, doit/2]).

    doit() ->
        doit.

    doit(A) ->
        [doit, A].

    doit(A, B) ->
        [doit, A, B].

Module bar.erl which 'mixes in' all functions from foo:

    -module(bar).
    -include_lib("mixer/include/mixer.hrl").
    -mixin([foo]).

or all except specific functions from foo:

    -module(bar).
    -include_lib("mixer/include/mixer.hrl").
    -mixin([{foo, except, [doit/0, doit/2]}]).

or only specific functions from foo:

    -module(bar).
    -include_lib("mixer/include/mixer.hrl").
    -mixin([{foo, [doit/0, doit/2]}]).

Another version of bar.erl which mixes in all functions from foo and some functions from baz:

    -module(bar).
    -include_lib("mixer/include/mixer.hrl").
    -mixin([foo, {baz, [doit/0, doit/1]}]).

One more version of bar.erl which mixes in foo:doit/0 and renames it to do_it_now/0:

    -module(bar).
    -include_lib("mixer/include/mixer.hrl").
    -mixin([{foo, [{doit/0, do_it_now}]}]).

Yet another version of bar.erl which mixes in all of foo's public functions not implemented by bar. In this case the functions foo:doit/0 and foo:doit/1 will be injected into bar.

    -module(bar).
    -include_lib("mixer/include/mixer.hrl").
    -mixin([{foo, except, module}]).
    -export([doit/2]).

    doit(A, B) ->
        [bar_did_it, A, B].

Last version of bar.erl, this time including specs for functions.

    -module(bar).
    -include_lib("mixer/include/mixer.hrl").
    -mixin_specs(all).
    -mixin([foo]).

(At this time the only valid value for mixin_specs is all).