%%%------------------------------------------------------------------- %%% File : eb_withdrawal_handler.erl %%% Author : Mitchell Hashimoto <mitchellh@Chip.local> %%% Description : An event handler to detect withdrawals larger than %%% a certain amount. %%% %%% Created : 7 Sep 2008 by Mitchell Hashimoto <mitchellh@Chip.local> %%%------------------------------------------------------------------- -module(eb_withdrawal_handler). -behaviour(gen_event). %% API -export([change_threshold/1]). %% gen_event callbacks -export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, code_change/3]). %%==================================================================== %% API %%==================================================================== %%-------------------------------------------------------------------- %% Function: change_threshold(Amount) -> {ok, Old, NewThreshold} %% | {error, Reason} %% Description: Changes the withdrawal amount threshold during runtime %%-------------------------------------------------------------------- change_threshold(Amount) -> gen_event:call(eb_event_manager, ?MODULE, {change_threshold, Amount}). %%==================================================================== %% gen_event callbacks %%==================================================================== %%-------------------------------------------------------------------- %% Function: init(Args) -> {ok, State} %% Description: Whenever a new event handler is added to an event manager, %% this function is called to initialize the event handler. %%-------------------------------------------------------------------- init([]) -> {ok, 500}. %%-------------------------------------------------------------------- %% Function: %% handle_event(Event, State) -> {ok, State} | %% {swap_handler, Args1, State1, Mod2, Args2} | %% remove_handler %% Description:Whenever an event manager receives an event sent using %% gen_event:notify/2 or gen_event:sync_notify/2, this function is called for %% each installed event handler to handle the event. %%-------------------------------------------------------------------- handle_event({withdraw, Name, Amount, NewBalance}, State) when Amount >= State -> io:format("WITHDRAWAL NOTIFICATION: ~p withdrew ~p leaving ~p left.~n", [Name, Amount, NewBalance]), {ok, State}; handle_event(_Event, State) -> {ok, State}. %%-------------------------------------------------------------------- %% Function: %% handle_call(Request, State) -> {ok, Reply, State} | %% {swap_handler, Reply, Args1, State1, %% Mod2, Args2} | %% {remove_handler, Reply} %% Description: Whenever an event manager receives a request sent using %% gen_event:call/3,4, this function is called for the specified event %% handler to handle the request. %%-------------------------------------------------------------------- handle_call({change_threshold, Amount}, State) -> io:format("NOTICE: Changing withdrawal threshold from ~p to ~p~n", [State, Amount]), {ok, {ok, State, Amount}, Amount}; handle_call(_Request, State) -> Reply = ok, {ok, Reply, State}. %%-------------------------------------------------------------------- %% Function: %% handle_info(Info, State) -> {ok, State} | %% {swap_handler, Args1, State1, Mod2, Args2} | %% remove_handler %% Description: This function is called for each installed event handler when %% an event manager receives any other message than an event or a synchronous %% request (or a system message). %%-------------------------------------------------------------------- handle_info(_Info, State) -> {ok, State}. %%-------------------------------------------------------------------- %% Function: terminate(Reason, State) -> void() %% Description:Whenever an event handler is deleted from an event manager, %% this function is called. It should be the opposite of Module:init/1 and %% do any necessary cleaning up. %%-------------------------------------------------------------------- terminate(_Reason, _State) -> ok. %%-------------------------------------------------------------------- %% Function: code_change(OldVsn, State, Extra) -> {ok, NewState} %% Description: Convert process state when code is changed %%-------------------------------------------------------------------- code_change(_OldVsn, State, _Extra) -> {ok, State}.