lib/untied-publisher/doorkeeper.rb in untied-publisher-0.0.3 vs lib/untied-publisher/doorkeeper.rb in untied-publisher-0.0.4
- old
+ new
@@ -10,11 +10,11 @@
# when ActiveRecord::Callbacks are fired.
#
# The following publisher watches the User after_create event:
#
# class MyDoorkeeper
- # include Untied::Doorkeeper
+ # include Untied::Publisher::Doorkeeper
#
# def initialize
# watch User, :after_create
# end
# end
@@ -25,18 +25,19 @@
end
# Watches ActiveRecord lifecycle callbacks for some Class
#
# class Doorkeeper
- # include Untied::Doorkeeper
+ # include Untied::Publisher::Doorkeeper
# end
#
# pub.new.watch(User, :after_create)
# User.create # sends the user into the wire
def watch(*args)
entity = args.shift
- observed << [entity, args]
+ options = args.last.is_a?(Hash) ? args.pop : {}
+ observed << [entity, args, options]
end
# Returns the list of classes watched
def observed_classes
observed.collect(&:first).collect(&:to_s).uniq.collect(&:constantize)
@@ -44,34 +45,51 @@
# Defines the methods that are called when the registered callbacks fire.
# For example, if the publisher is defined as follows:
#
# class MyDoorkeeper
- # include Untided::Doorkeeper
+ # include Untided::Publisher::Doorkeeper
#
# def initialize
# watch User, :after_create
# end
# end
#
# After calling MyDoorkeeper#define_callbacks the method
# _notify_untied__publisher_observer_for_after_create is created on User's
# model. This method is called when the after_create callback is fired.
def define_callbacks
+ observed.each do |(klass, callbacks, options)|
+ ActiveRecord::Callbacks::CALLBACKS.each do |callback|
+ next unless callbacks.include?(callback)
+ setup_observer(klass, callback, options)
+ end
+ end
+ end
+
+ protected
+
+ def setup_observer(klass, callback, options={})
observer = Untied::Publisher::Observer
observer_name = observer.name.underscore.gsub('/', '__')
+ notifier_meth = :"_notify_#{observer_name}_for_#{callback}"
- observed.each do |(klass, callbacks)|
- ActiveRecord::Callbacks::CALLBACKS.each do |callback|
- next unless callbacks.include?(callback)
- callback_meth = :"_notify_#{observer_name}_for_#{callback}"
- unless klass.respond_to?(callback_meth)
- klass.send(:define_method, callback_meth) do
- observer.instance.send(callback, self)
- end
- klass.send(callback, callback_meth)
- end
+ if define_notifier_method(klass, observer, callback, notifier_meth, options)
+ klass.send(callback, notifier_meth)
end
+
+ klass
+ end
+
+ def define_method_on(klass, method_name, &block)
+ unless klass.respond_to?(method_name)
+ klass.send(:define_method, method_name, &block)
+ end
+ end
+
+ def define_notifier_method(klass, observer, callback, method_name, options={})
+ define_method_on(klass, method_name) do
+ observer.instance.send(callback, self, options)
end
end
end
end
end