]> granicus.if.org Git - ejabberd/commitdiff
* src/ejabberd_hooks.erl: anonymous functions support.
authorEvgeniy Khramtsov <xramtsov@gmail.com>
Fri, 6 Mar 2009 09:34:13 +0000 (09:34 +0000)
committerEvgeniy Khramtsov <xramtsov@gmail.com>
Fri, 6 Mar 2009 09:34:13 +0000 (09:34 +0000)
SVN Revision: 1969

ChangeLog
src/ejabberd_hooks.erl

index 03b41b8039df39efb5d0f7ffc79c94a7e340e515..1c2c5d12b937c1f0e0a8e495d496fa80a41304ee 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2009-03-06  Evgeniy Khramtsov <ekhramtsov@process-one.net>
+
+       * src/ejabberd_hooks.erl: anonymous functions support.
+
 2009-03-05  Badlop  <badlop@process-one.net>
 
        * src/ejabberd_app.erl: In a Windows machine, explicitly add the
index 6c75037c836fc4a19639b77faad308a2c4725109..1f168a1855b0f18e95159f42fa3ebb1eee6cd9b3 100644 (file)
@@ -31,7 +31,9 @@
 
 %% External exports
 -export([start_link/0,
+        add/3,
         add/4,
+        delete/3,
         delete/4,
         run/2,
         run_fold/3,
 start_link() ->
     gen_server:start_link({local, ejabberd_hooks}, ejabberd_hooks, [], []).
 
+%% @spec (Hook::atom(), Function::function(), Seq::integer()) -> ok
+%% @doc See add/4.
+add(Hook, Function, Seq) when is_function(Function) ->
+    add(Hook, global, undefined, Function, Seq).
+
+add(Hook, Host, Function, Seq) when is_function(Function) ->
+    add(Hook, Host, undefined, Function, Seq);
+
 %% @spec (Hook::atom(), Module::atom(), Function::atom(), Seq::integer()) -> ok
 %% @doc Add a module and function to this hook.
 %% The integer sequence is used to sort the calls: low number is called before high number.
@@ -67,6 +77,14 @@ add(Hook, Module, Function, Seq) ->
 add(Hook, Host, Module, Function, Seq) ->
     gen_server:call(ejabberd_hooks, {add, Hook, Host, Module, Function, Seq}).
 
+%% @spec (Hook::atom(), Function::function(), Seq::integer()) -> ok
+%% @doc See del/4.
+delete(Hook, Function, Seq) when is_function(Function) ->
+    delete(Hook, global, undefined, Function, Seq).
+
+delete(Hook, Host, Function, Seq) when is_function(Seq) ->
+    delete(Hook, Host, undefined, Function, Seq);
+
 %% @spec (Hook::atom(), Module::atom(), Function::atom(), Seq::integer()) -> ok
 %% @doc Delete a module and function from this hook.
 %% It is important to indicate exactly the same information than when the call was added.
@@ -200,7 +218,12 @@ code_change(_OldVsn, State, _Extra) ->
 run1([], _Hook, _Args) ->
     ok;
 run1([{_Seq, Module, Function} | Ls], Hook, Args) ->
-    case catch apply(Module, Function, Args) of
+    Res = if is_function(Function) ->
+                 catch apply(Function, Args);
+            true ->
+                 catch apply(Module, Function, Args)
+         end,
+    case Res of
        {'EXIT', Reason} ->
            ?ERROR_MSG("~p~nrunning hook: ~p",
                       [Reason, {Hook, Args}]),
@@ -215,7 +238,12 @@ run1([{_Seq, Module, Function} | Ls], Hook, Args) ->
 run_fold1([], _Hook, Val, _Args) ->
     Val;
 run_fold1([{_Seq, Module, Function} | Ls], Hook, Val, Args) ->
-    case catch apply(Module, Function, [Val | Args]) of
+    Res = if is_function(Function) ->
+                 catch apply(Function, [Val | Args]);
+            true ->
+                 catch apply(Module, Function, [Val | Args])
+         end,
+    case Res of
        {'EXIT', Reason} ->
            ?ERROR_MSG("~p~nrunning hook: ~p",
                       [Reason, {Hook, Args}]),