aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/identity_map.rb
diff options
context:
space:
mode:
authorMarcin Raczkowski <marcin.raczkowski@gmail.com>2010-08-28 18:29:28 +0200
committerEmilio Tagua <miloops@gmail.com>2010-11-19 19:03:56 -0300
commit3df4460a742c18af8cc71e41009c9028467d16b5 (patch)
tree47c00279b3e026e966ff5142150e086fb3b5e19f /activerecord/lib/active_record/identity_map.rb
parent902ae14e650d87bc0ba3d34030c9bb38646c0d9f (diff)
downloadrails-3df4460a742c18af8cc71e41009c9028467d16b5.tar.gz
rails-3df4460a742c18af8cc71e41009c9028467d16b5.tar.bz2
rails-3df4460a742c18af8cc71e41009c9028467d16b5.zip
IdentityMap - Adding Weakling and IM Base as concern
Diffstat (limited to 'activerecord/lib/active_record/identity_map.rb')
-rw-r--r--activerecord/lib/active_record/identity_map.rb64
1 files changed, 64 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/identity_map.rb b/activerecord/lib/active_record/identity_map.rb
new file mode 100644
index 0000000000..79eb4dd83a
--- /dev/null
+++ b/activerecord/lib/active_record/identity_map.rb
@@ -0,0 +1,64 @@
+module ActiveRecord
+ module IdentityMap
+ extend ActiveSupport::Concern
+
+ class << self
+ attr_accessor :repositories
+ attr_accessor :current_repository_name
+ attr_accessor :enabled
+
+ def current
+ repositories[current_repository_name] ||= Weakling::WeakHash.new
+ end
+
+ def with_repository(name = :default, &block)
+ old_repository = self.current_repository_name
+ self.current_repository_name = name
+
+ block.call(current)
+ ensure
+ self.current_repository_name = old_repository
+ end
+
+ def without(&block)
+ old, self.enabled = self.enabled, false
+
+ block.call
+ ensure
+ self.enabled = old
+ end
+
+ def get(class_name, primary_key)
+ current[[class_name, primary_key]]
+ end
+
+ def add(record)
+ current[[record.class.name, record.id]] = record
+ end
+
+ def remove(record)
+ current.delete([record.class.name, record.id])
+ end
+
+ def clear
+ current.clear
+ end
+
+ alias enabled? enabled
+ end
+
+ self.repositories ||= Hash.new
+ self.current_repository_name ||= :default
+ self.enabled = true
+
+ module InstanceMethods
+
+ end
+
+ module ClassMethods
+ def identity_map
+ ActiveRecord::IdentityMap
+ end
+ end
+ end
+end