Skip to content
/ mixer Public
forked from chef/mixer

Mix in functions from other modules

License

Notifications You must be signed in to change notification settings

inaka/mixer

 
 

Repository files navigation

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).

About

Mix in functions from other modules

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Erlang 100.0%