%% ---
%%  Excerpted from "Programming Erlang",
%%  published by The Pragmatic Bookshelf.
%%  Copyrights apply to this code. It may not be used to create training material,
%%  courses, books, articles, and the like. Contact us if you are in doubt.
%%  We make no guarantees that this code is fit for any purpose.
%%  Visit http://www.pragmaticprogrammer.com/titles/jaerlang for more book information.
%%  
%%  日本語版の『プログラミングErlang』、およびサンプルコードについては、
%%   http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06714-3 を確認してください。
%% ---
-module(event_handler).
-export([make/1, add_handler/2, event/2]).

%% Nameという名前の新しいイベントハンドラを作る
%%  ハンドラ関数にはno_opを使う -- つまりイベントに対して何もしない
make(Name) ->
    register(Name, spawn(fun() -> my_handler(fun no_op/1) end)).

add_handler(Name, Fun) -> Name ! {add, Fun}.

%% イベントを生成する
event(Name, X) -> Name ! {event, X}.

my_handler(Fun) ->
    receive
	{add, Fun1} ->
	    my_handler(Fun1);
	{event, Any} ->
	    (catch Fun(Any)),
	    my_handler(Fun)
    end.

no_op(_) -> void.
    
