<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/satisfaction/external_dependencies.rb</filename>
    </added>
    <added>
      <filename>lib/satisfaction/identity_map.rb</filename>
    </added>
    <added>
      <filename>spec/identity_map_spec.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,33 +1,36 @@
-require 'rubygems'
-require 'active_support'
-require 'hpricot'
-require 'json'
-gem('memcache-client')
-require 'memcache'
-
-require 'oauth'
-require 'oauth/signature/hmac/sha1'
-require 'oauth/client/net_http'
-
-require 'satisfaction/has_satisfaction'
-require 'satisfaction/loader'
-require 'satisfaction/associations'
-require 'satisfaction/resource'
-
-require 'satisfaction/company'
-require 'satisfaction/person'
-require 'satisfaction/topic'
-# require 'satisfaction/tag'
-# require 'satisfaction/product'
-require 'satisfaction/reply'
+require 'satisfaction/external_dependencies'
 
 class Satisfaction
+  # ==================
+  # = Core Utilities =
+  # ==================
+  require 'satisfaction/has_satisfaction'
+  require 'satisfaction/associations'
+  require 'satisfaction/resource'
+  require 'satisfaction/loader'
+  require 'satisfaction/identity_map'
+  
+  
+  # =============
+  # = Resources =
+  # =============
+  
+  require 'satisfaction/company'
+  require 'satisfaction/person'
+  require 'satisfaction/topic'
+  # require 'satisfaction/tag'
+  # require 'satisfaction/product'
+  require 'satisfaction/reply'
+  
+  # =============
+  
   include Associations
   
   attr_reader :options
   attr_reader :loader
   attr_reader :consumer
   attr_reader :token
+  attr_reader :identity_map
 
   
   def initialize(options={})
@@ -38,7 +41,8 @@ class Satisfaction
       :access_token_url =&gt; 'http://getsatisfaction.com/api/access_token',
       :authorize_url =&gt; 'http://getsatisfaction.com/api/authorize',
     })
-    @loader = Loader.new
+    @loader = Satisfaction::Loader.new
+    @identity_map = Satisfaction::IdentityMap.new
     
     has_many :companies, :url =&gt; '/companies'
     has_many :people, :url =&gt; '/people'</diff>
      <filename>lib/satisfaction.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,11 @@
-class Loader::HashCache
+class Satisfaction::Loader::HashCache
   def initialize
     @cached_responses = {}
   end
   
   def put(url, response)
     return nil if response[&quot;ETag&quot;].blank?
-    @cached_responses[url.to_s] = Loader::CacheRecord.new(url, response[&quot;ETag&quot;], response.body)
+    @cached_responses[url.to_s] = Satisfaction::Loader::CacheRecord.new(url, response[&quot;ETag&quot;], response.body)
   end
   
   def get(url)</diff>
      <filename>lib/satisfaction/cache/hash.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 
-class Loader::MemcacheCache
+class Satisfaction::Loader::MemcacheCache
   def initialize(options = {})
     options = options.reverse_merge({:servers =&gt; ['127.0.0.1:11211'], :namespace =&gt; 'satisfaction', })
     @m = MemCache.new(options.delete(:servers), options)</diff>
      <filename>lib/satisfaction/cache/memcache.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-class HasSatisfaction
+class Satisfaction::HasSatisfaction
   attr_reader :satisfaction
   
   def initialize(satisfaction)</diff>
      <filename>lib/satisfaction/has_satisfaction.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@ require 'net/http'
 require 'uri'
 
 
-class Loader
+class Satisfaction::Loader
   require 'satisfaction/cache/hash'
   require 'satisfaction/cache/memcache'
 
@@ -13,8 +13,8 @@ class Loader
   def initialize(options={})
     @options = options.reverse_merge({:cache =&gt; :hash})
     @cache =  case @options[:cache]
-              when :hash then Loader::HashCache.new
-              when :memcache then Loader::MemcacheCache.new(@options[:memcache] || {})
+              when :hash then HashCache.new
+              when :memcache then MemcacheCache.new(@options[:memcache] || {})
               else
                 raise ArgumentError, &quot;Invalid cache spec: #{@options[:cache]}&quot;
               end</diff>
      <filename>lib/satisfaction/loader.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,6 @@
 require 'forwardable'
 
-class Resource &lt; HasSatisfaction
+class Resource &lt; Satisfaction::HasSatisfaction
   require 'satisfaction/resource/attributes'
   include ::Associations
   include Attributes
@@ -31,8 +31,9 @@ class Resource &lt; HasSatisfaction
   end
 end
 
-class ResourceCollection &lt; HasSatisfaction
+class ResourceCollection &lt; Satisfaction::HasSatisfaction
   attr_reader :klass
+  attr_reader :path
   
   def initialize(klass, satisfaction, path)
     super satisfaction
@@ -41,15 +42,17 @@ class ResourceCollection &lt; HasSatisfaction
   end
   
   def page(number, options={})
-    Page.new(@klass, number, @path, satisfaction, options)
+    Page.new(self, number, options)
   end
   
-  def get(id, options={})
-    klass.new(id, satisfaction)
+  def get(id)
+    satisfaction.identity_map.get_record(klass, id) do
+      klass.new(id, satisfaction)
+    end
   end
 end
 
-class Page &lt; HasSatisfaction
+class Page &lt; Satisfaction::HasSatisfaction
   attr_reader :total
   
   extend Forwardable
@@ -66,11 +69,11 @@ class Page &lt; HasSatisfaction
   def_delegator :items, :to_a
   def_delegator :items, :empty?
   
-  def initialize(klass, number, path, satisfaction, options)
-    super(satisfaction)    
-    @klass = klass
-    @number = number
-    @path = path
+  def initialize(collection, page, options={})
+    super(collection.satisfaction)
+    @klass = collection.klass
+    @page = page
+    @path = collection.path
     @options = options
   end
   
@@ -85,16 +88,26 @@ class Page &lt; HasSatisfaction
   end
   
   def next?
-    last_item = @number * length
+    last_item = @page * length
     @total &gt; last_item
   end
   
+  def page_count
+    result = @total / length
+    result += 1 if @total % length != 0
+    result
+  end
+  
   def load
-    results = satisfaction.get(&quot;#{@path}.json&quot;, @options.merge(:page =&gt; @number))
+    results = satisfaction.get(&quot;#{@path}.json&quot;, @options.merge(:page =&gt; @page))
     json = JSON.parse(results)
     @total = json[&quot;total&quot;]
+    
     json[&quot;data&quot;].map do |result|
-      @klass.decode_sfn(result, satisfaction)
+      obj = @klass.decode_sfn(result, satisfaction)
+      satisfaction.identity_map.get_record(@klass, obj.id) do
+        obj
+      end
     end
   end
 end
\ No newline at end of file</diff>
      <filename>lib/satisfaction/resource.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,5 +5,5 @@ $:.unshift &quot;#{File.dirname(__FILE__)}/../lib&quot;
 require 'satisfaction'
 
 Spec::Runner.configure do |config|
-  config.prepend_before(:each){ @satisfaction = Satisfaction.new(:root =&gt; 'http://localhost:3000') }
+  config.prepend_before(:each){ @satisfaction = Satisfaction.new(:root =&gt; 'http://api.getsatisfaction.com') }
 end
\ No newline at end of file</diff>
      <filename>spec/spec_helper.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>750418b6b9d12f718c6ce342c1aab8d507dca07d</id>
    </parent>
  </parents>
  <author>
    <name>Scott Fleckenstein</name>
    <email>nullstyle@gmail.com</email>
  </author>
  <url>http://github.com/nullstyle/ruby-satisfaction/commit/91ab9bf4c484db1985d909a1f8e2a23c2e7d17c1</url>
  <id>91ab9bf4c484db1985d909a1f8e2a23c2e7d17c1</id>
  <committed-date>2008-02-18T14:35:05-08:00</committed-date>
  <authored-date>2008-02-18T14:35:05-08:00</authored-date>
  <message>Beginnings of work on Identity Map, plus fixes

[ADDED]   Identity mapping system for singular objects loaded from API
[ADDED]   refactor external requires into their own file
[ADDED]   page_count helper to Page
[FIXED]   namespacing issues</message>
  <tree>29b8cfba4e2c5074cf047dc6a4cdd4a84d1bed5c</tree>
  <committer>
    <name>Scott Fleckenstein</name>
    <email>nullstyle@gmail.com</email>
  </committer>
</commit>
