summaryrefslogtreecommitdiffstats
path: root/test/lib/spec/callback/callback_container.rb
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-03-17 02:48:41 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-03-17 02:48:41 +0000
commitba23a5ac276e59fdda8186750c6d0fd2cfecdeac (patch)
tree1e14b25ade74ea52d8da2788ede9b12b507867e8 /test/lib/spec/callback/callback_container.rb
parent8ea6adaeb1e3d0aa6348c2a2c3a385d185372d06 (diff)
Adding spec libs, so we can use them some day
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2283 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'test/lib/spec/callback/callback_container.rb')
-rw-r--r--test/lib/spec/callback/callback_container.rb60
1 files changed, 60 insertions, 0 deletions
diff --git a/test/lib/spec/callback/callback_container.rb b/test/lib/spec/callback/callback_container.rb
new file mode 100644
index 000000000..24d4c0ced
--- /dev/null
+++ b/test/lib/spec/callback/callback_container.rb
@@ -0,0 +1,60 @@
+module Callback
+ class CallbackContainer
+ def initialize
+ @callback_registry = Hash.new do |hash, key|
+ hash[key] = Array.new
+ end
+ end
+
+ # Defines the callback with the key in this container.
+ def define(key, callback_proc=nil, &callback_block)
+ callback = extract_callback(callback_block, callback_proc) do
+ raise "You must define the callback that accepts the call method."
+ end
+ @callback_registry[key] << callback
+ callback
+ end
+
+ # Undefines the callback with the key in this container.
+ def undefine(key, callback_proc)
+ callback = extract_callback(callback_proc) do
+ raise "You may only undefine callbacks that use the call method."
+ end
+ @callback_registry[key].delete callback
+ callback
+ end
+
+ # Notifies the callbacks for the key. Arguments may be passed.
+ # An error handler may be passed in as a block. If there is an error, the block is called with
+ # error object as an argument.
+ # An array of the return values of the callbacks is returned.
+ def notify(key, *args, &error_handler)
+ @callback_registry[key].collect do |callback|
+ begin
+ callback.call(*args)
+ rescue Exception => e
+ yield(e) if error_handler
+ end
+ end
+ end
+
+ # Clears all of the callbacks in this container.
+ def clear
+ @callback_registry.clear
+ end
+
+ protected
+ def extract_callback(first_choice_callback, second_choice_callback = nil)
+ callback = nil
+ if first_choice_callback
+ callback = first_choice_callback
+ elsif second_choice_callback
+ callback = second_choice_callback
+ end
+ unless callback.respond_to? :call
+ yield
+ end
+ return callback
+ end
+ end
+end