Skip to content

Instantly share code, notes, and snippets.

@whoahbot
Created September 19, 2009 18:23
Show Gist options
  • Select an option

  • Save whoahbot/189546 to your computer and use it in GitHub Desktop.

Select an option

Save whoahbot/189546 to your computer and use it in GitHub Desktop.
module PersistentIdentityMap
def self.included(base)
base.extend(ResourceClassMethods)
end
def _dump(depth)
marshaled_properties = properties.inject({}) do |h, p|
h[p.instance_variable_name] = p.get!(self)
h
end
Marshal.dump(marshaled_properties)
end
module ResourceClassMethods
def _load(marshaled_properties)
attributes = Marshal.load(marshaled_properties)
resource = self.new
resource.send(:properties).each do |p|
p.set!(resource, attributes[p.instance_variable_name])
end
resource.instance_variable_set(:@saved, true)
resource
end
end
end
require "moneta"
require 'moneta/redis'
module DataMapper
# Tracks objects to help ensure that each object gets loaded only once.
# See: http://www.martinfowler.com/eaaCatalog/identityMap.html
class IdentityMap < Moneta::Redis
extend Deprecate
deprecate :get, :[]
deprecate :set, :[]=
def [](key)
resource = super(key)
Marshal.load(resource) if resource
end
def []=(key, resource)
super(key, Marshal.dump(resource))
end
end # class IdentityMap
end # module DataMapper
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment