$one = MyObject->get(123); $two = MyObject->get(123); refaddr($one) == refaddr($two) #### -> the in memory cache -> memcached -> the DB #### GET doc 123 -> returns version 6 SEARCH for doc 123 -> returns version 5 #### $a = get -> version 1 $b = search -> version 1 #### $a = get -> version 1 $b = search -> version 1 $a->change() $a->save() -> version 2 #### $a = get -> version 2 $b = search -> version 1 #### $a = get -> version 1 $a->change() $b = search -> version 1 #### $a = get -> version 1 $a->change() $b = search -> version 2 #### my ($class,$id,$version,$data) = @_; if (my $cached = $cache->{$id}) { return $cached if $version <= $cached->{version}; return $cache->re_new($data); unless $cached->has_changed; } return $cache->{$id} = $class->new($data);