From a332712503ec71cea516a6c25fdac85cf44d0adc Mon Sep 17 00:00:00 2001
From: wangjohn <wangjohn@mit.edu>
Date: Mon, 8 Apr 2013 14:12:52 -0400
Subject: Delegating the value getter and setters in the ScopeRegistry to the
 current ScopeRegister object.

---
 activerecord/lib/active_record/scoping.rb         | 21 ++++++++++++++-------
 activerecord/lib/active_record/scoping/default.rb |  4 ++--
 2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/activerecord/lib/active_record/scoping.rb b/activerecord/lib/active_record/scoping.rb
index b631730ab3..f108ab0fe0 100644
--- a/activerecord/lib/active_record/scoping.rb
+++ b/activerecord/lib/active_record/scoping.rb
@@ -9,11 +9,11 @@ module ActiveRecord
 
     module ClassMethods
       def current_scope #:nodoc:
-        ScopeRegistry.current.value_for(:current_scope, base_class.to_s)
+        ScopeRegistry.value_for(:current_scope, base_class.to_s)
       end
 
       def current_scope=(scope) #:nodoc:
-        ScopeRegistry.current.set_value_for(:current_scope, base_class.to_s, scope)
+        ScopeRegistry.set_value_for(:current_scope, base_class.to_s, scope)
       end
     end
 
@@ -41,16 +41,23 @@ module ActiveRecord
     #
     #   registry.value_for(:current_scope, "Board")
     #
-    # You will obtain whatever was defined in +some_new_scope+.
+    # You will obtain whatever was defined in +some_new_scope+. The +value_for+
+    # and +set_value_for+ methods are delegated to the current +ScopeRegistry+
+    # object, so the above example code can also be called as:
+    #
+    #   ActiveRecord::Scoping::ScopeRegistry.set_value_for(:current_scope,
+    #       "Board", some_new_scope)
     class ScopeRegistry # :nodoc:
-      def self.current
-        Thread.current["scope_registry"] ||= new
+      class << self
+        delegate :value_for, :set_value_for, to: :current
+
+        def current
+          Thread.current["scope_registry"] ||= new
+        end
       end
 
       VALID_SCOPE_TYPES = [:current_scope, :ignore_default_scope]
 
-      attr_accessor :registry
-
       def initialize
         @registry = Hash.new { |hash, key| hash[key] = {} }
       end
diff --git a/activerecord/lib/active_record/scoping/default.rb b/activerecord/lib/active_record/scoping/default.rb
index daee771669..d37d33d552 100644
--- a/activerecord/lib/active_record/scoping/default.rb
+++ b/activerecord/lib/active_record/scoping/default.rb
@@ -120,11 +120,11 @@ module ActiveRecord
         end
 
         def ignore_default_scope? # :nodoc:
-          ScopeRegistry.current.value_for(:ignore_default_scope, self)
+          ScopeRegistry.value_for(:ignore_default_scope, self)
         end
 
         def ignore_default_scope=(ignore) # :nodoc:
-          ScopeRegistry.current.set_value_for(:ignore_default_scope, self, ignore)
+          ScopeRegistry.set_value_for(:ignore_default_scope, self, ignore)
         end
 
         # The ignore_default_scope flag is used to prevent an infinite recursion
-- 
cgit v1.2.3