src/erlias.erl

-module(erlias).
-export([build/2, build_text/2]).
-include_lib("syntax_tools/include/merl.hrl").

build(BaseMod, Alias) ->
	msg(io_lib:format("Building alias ~p ==> ~p.",[Alias, BaseMod])),
    Modtext = build_text(BaseMod, Alias),
	Forms = merl:quote(Modtext),
	Res = merl:compile_and_load(Forms),
	case Res of 
		{ok, _} -> ok;
		error ->
			error_logger:error_msg("Erlias: Unable to compile alias module (~p).~n~s~n", [Modtext]),
			error
	end.

build_text(BaseMod, Alias) ->
	Exports = BaseMod:module_info(exports),
	Modtext = build_module(BaseMod, Alias, Exports),
    Modtext.

build_module(BaseMod, Alias, Exports) ->
	lists:flatten([
		build_header(Alias),
		build_exports(BaseMod, Exports)
	]).

build_header(Alias) ->
	"-module(" ++ atom_to_list(Alias) ++ ").\n"
	"-compile(export_all).\n".

build_exports(BaseMod, Exports) ->
	[build_export(BaseMod, FunArity) || FunArity <- Exports].

build_export(_, {module_info,_}) ->
	""; %% ignore module_info
build_export(BaseMod, {Fun, Arity}) ->
	Arglist = arglist(Arity),
	StrFun = atom_to_list(Fun),
	FunCall = StrFun ++ "(" ++ Arglist ++ ")",
	_Line = prefixize(BaseMod, FunCall).

prefixize(BaseMod, FunCall) ->
	FunCall ++ " -> " ++ atom_to_list(BaseMod) ++ ":" ++ FunCall ++ ".\n".
	
arglist( Argc) ->
	Args = lists:seq(1, Argc),
	StrArgs = [["Arg" ++ integer_to_list(Arg)] || Arg <- Args],
	string:join(StrArgs, ",").

msg(Msg) ->
	io:format("Erlias: ~s~n",[Msg]).