diff options
author | Emilio Tagua <miloops@gmail.com> | 2009-09-08 15:39:33 -0300 |
---|---|---|
committer | Emilio Tagua <miloops@gmail.com> | 2009-09-08 15:39:33 -0300 |
commit | 0489f0c582d2ab70595296f058545b102466bebd (patch) | |
tree | 159a85dda7bdb652c93cc05a7ab422283c9f3035 /activerecord/lib/active_record/observer.rb | |
parent | 670281c6b2e9b9e8c51a140f2a5f66b251f1b84b (diff) | |
parent | af5b12c64c878f08336d38e91cc64137a30fb8da (diff) | |
download | rails-0489f0c582d2ab70595296f058545b102466bebd.tar.gz rails-0489f0c582d2ab70595296f058545b102466bebd.tar.bz2 rails-0489f0c582d2ab70595296f058545b102466bebd.zip |
Merge commit 'rails/master'
Diffstat (limited to 'activerecord/lib/active_record/observer.rb')
-rw-r--r-- | activerecord/lib/active_record/observer.rb | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/activerecord/lib/active_record/observer.rb b/activerecord/lib/active_record/observer.rb index a34ff4a47a..4e05b819b5 100644 --- a/activerecord/lib/active_record/observer.rb +++ b/activerecord/lib/active_record/observer.rb @@ -1,6 +1,3 @@ -require 'singleton' -require 'set' - module ActiveRecord # Observer classes respond to lifecycle callbacks to implement trigger-like # behavior outside the original class. This is a great way to reduce the @@ -88,11 +85,17 @@ module ActiveRecord # singletons and that call instantiates and registers them. # class Observer < ActiveModel::Observer + extlib_inheritable_accessor(:observed_methods){ [] } + def initialize super observed_subclasses.each { |klass| add_observer!(klass) } end + def self.method_added(method) + observed_methods << method if ActiveRecord::Callbacks::CALLBACKS.include?(method.to_sym) + end + protected def observed_subclasses observed_classes.sum([]) { |klass| klass.send(:subclasses) } @@ -100,8 +103,15 @@ module ActiveRecord def add_observer!(klass) super - if respond_to?(:after_find) && !klass.method_defined?(:after_find) - klass.class_eval 'def after_find() end' + + # Check if a notifier callback was already added to the given class. If + # it was not, add it. + self.observed_methods.each do |method| + callback = :"_notify_observers_for_#{method}" + if (klass.instance_methods & [callback, callback.to_s]).empty? + klass.class_eval "def #{callback}; notify_observers(:#{method}); end" + klass.send(method, callback) + end end end end |