diff -rNu boomer-r1117/extlib/Data/ObjectDriver/Driver/Cache/Memcached/Fast.pm boomer/extlib/Data/ObjectDriver/Driver/Cache/Memcached/Fast.pm
--- boomer-r1117/extlib/Data/ObjectDriver/Driver/Cache/Memcached/Fast.pm	1970-01-01 09:00:00.000000000 +0900
+++ boomer/extlib/Data/ObjectDriver/Driver/Cache/Memcached/Fast.pm	2007-12-20 14:18:31.000000000 +0900
@@ -0,0 +1,154 @@
+# $Id$
+
+package Data::ObjectDriver::Driver::Cache::Memcached::Fast;
+use strict;
+use warnings;
+
+use base qw( Data::ObjectDriver::Driver::BaseCache );
+
+use Cache::Memcached::Fast;
+use Carp ();
+
+sub deflate {
+    my $driver = shift;
+    my($obj) = @_;
+    $obj->deflate;
+}
+
+sub inflate {
+    my $driver = shift;
+    my($class, $data) = @_;
+    $class->inflate($data);
+}
+
+my %memc_method_for = (
+    add_to_cache         => 'add',
+    update_cache         => 'set',
+    remove_from_cache    => 'delete',
+    get_from_cache       => 'get',
+    get_multi_from_cache => 'get_multi',
+);
+
+for my $driver_method (keys %memc_method_for) {
+    my $memc_method = $memc_method_for{$driver_method};
+    my $sub = sub {
+        my $driver = shift;
+
+        $driver->start_query('MEMCACHED_' . uc($memc_method) . ' ?', \@_);
+        my $ret = $driver->cache->$memc_method(@_);
+        $driver->end_query(undef);
+
+        return if !defined $ret;
+        return $ret;
+    };
+
+    no strict 'refs';
+    *{join q{::}, __PACKAGE__, $driver_method} = $sub;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Data::ObjectDriver::Driver::Cache::Memcached::Fast - object driver for caching objects with memcached
+
+=head1 SYNOPSIS
+
+    package MyObject;
+    use base qw( Data::ObjectDriver::BaseObject );
+
+    __PACKAGE__->install_properties({
+        ...
+        driver => Data::ObjectDriver::Driver::Cache::Memcached::Fast->new(
+            cache    => Cache::Memcached::Fast->new({ servers => \@MEMCACHED_SERVERS }),
+            fallback => Data::ObjectDriver::Driver::DBI->new( @$DBI_INFO ),
+        ),
+        ...
+    });
+
+    1;
+
+=head1 DESCRIPTION
+
+I<Data::ObjectDriver::Driver::Cache::Memcached::Fast> provides automatic caching of
+retrieved objects in your memcached servers, when used in conjunction with your
+actual object driver.
+
+=head1 USAGE
+
+=over 4
+
+=item * Data::ObjectDriver::Driver::Cache::Memcached::Fast->new( %params )
+
+Required members of C<%params> are:
+
+=over 4
+
+=item * C<cache>
+
+The C<Cache::Memcached::Fast> instance representing your pool of memcached servers.
+See L<Cache::Memcached::Fast>.
+
+=item * C<fallback>
+
+The C<Data::ObjectDriver> object driver from which to request objects that are
+not found in your memcached servers.
+
+=back
+
+=back
+
+=head1 DIAGNOSTICS
+
+The memcached driver provides integration with the C<Data::ObjectDriver> debug
+and profiling systems. As these systems are designed around SQL queries,
+synthetic queries are logged to represent memcached operations. The operations
+generated by this driver are:
+
+=over 4
+
+=item * C<MEMCACHED_ADD ?>
+
+Put an item in the cache that was not there. The arguments are the cache key
+for the object and the flattened representation of the object to cache.
+
+=item * C<MEMCACHED_SET ?>
+
+Put an item in the cache with new member data. The arguments are the cache key
+for the object and the flattened representation of the object to cache.
+
+=item * C<MEMCACHED_DELETE ?>
+
+Remove an object from the cache. The argument is the cache key for the object
+to invalidate.
+
+=item * C<MEMCACHED_GET ?>
+
+Retrieve an object. The argument is the cache key for the requested object.
+
+=item * C<MEMCACHED_GET_MULTI ?>
+
+Retrieve a set of objects. The arguments are the cache keys for the requested
+objects.
+
+=back
+
+=head1 SEE ALSO
+
+C<Cache::Memcached>, http://www.danga.com/memcached/
+C<Cache::Memcached::Fast>, http://search.cpan.org/dist/Cache-Memcached-Fast
+
+=head1 LICENSE
+
+I<Data::ObjectDriver> is free software; you may redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 AUTHOR & COPYRIGHT
+
+Except where otherwise noted, I<Data::ObjectDriver> is Copyright 2005-2006
+Six Apart, cpan@sixapart.com. All rights reserved.
+
+=cut
+
diff -rNu boomer-r1117/lib/MT/Core.pm boomer/lib/MT/Core.pm
--- boomer-r1117/lib/MT/Core.pm	2007-12-13 00:29:01.000000000 +0900
+++ boomer/lib/MT/Core.pm	2007-12-20 16:32:01.000000000 +0900
@@ -470,6 +470,8 @@
             'AssetCacheDir'             => { default => 'assets_c', },
             'MemcachedServers'          => { type    => 'ARRAY', },
             'MemcachedNamespace'        => undef,
+            ## Experimental
+            'MemcachedDriver'           => { default => 'Cache::Memcached' },
             'CommenterRegistration'     => {
                 type    => 'HASH',
                 default => {
diff -rNu boomer-r1117/lib/MT/Memcached.pm boomer/lib/MT/Memcached.pm
--- boomer-r1117/lib/MT/Memcached.pm	2007-12-13 00:29:01.000000000 +0900
+++ boomer/lib/MT/Memcached.pm	2007-12-20 16:25:57.000000000 +0900
@@ -12,10 +12,11 @@
     my $cfg = MT->config;
 
     if (my @servers = $cfg->MemcachedServers) {
-        require Cache::Memcached;
+        my $driver_class = $cfg->MemcachedDriver;
+        eval "require $driver_class;";
         my $ns = $cfg->MemcachedNamespace;
         return bless {
-            memcached => Cache::Memcached->new({
+            memcached => $driver_class->new({
                 servers => \@servers,
                 ( $ns ? ( namespace => $ns ) : () ),
                 debug   => 0,
@@ -29,7 +30,8 @@
 sub is_available {
     my $class = shift;
     my @servers = MT->config->MemcachedServers;
-    return @servers > 0 && eval { require Cache::Memcached } ? 1 : 0;
+    my $driver_class = MT->config->MemcachedDriver;
+    return @servers > 0 && eval "require $driver_class;" ? 1 : 0;
 }
 
 our $Instance;
@@ -39,7 +41,8 @@
 
 sub cleanup {
     undef $Instance;
-    Cache::Memcached->disconnect_all;
+    Cache::Memcached->disconnect_all
+        if MT->config->MemcachedDriver eq 'Cache::Memcached';
 }
 
 sub DESTROY { }
diff -rNu boomer-r1117/lib/MT/ObjectDriverFactory.pm boomer/lib/MT/ObjectDriverFactory.pm
--- boomer-r1117/lib/MT/ObjectDriverFactory.pm	2007-12-13 00:29:01.000000000 +0900
+++ boomer/lib/MT/ObjectDriverFactory.pm	2007-12-20 14:44:16.000000000 +0900
@@ -64,9 +64,10 @@
 
     my $driver;
     if (MT::Memcached->is_available) {
-        require Data::ObjectDriver::Driver::Cache::Memcached;
+        my $cache_class = 'Data::ObjectDriver::Driver::' . $cfg->MemcachedDriver;
+        eval "require $cache_class;";
         $driver = Data::ObjectDriver::Driver::Cache::RAM->new(
-            fallback => Data::ObjectDriver::Driver::Cache::Memcached->new(
+            fallback => $cache_class->new(
                 cache => MT::Memcached->instance,
                 fallback => $dbi_driver,
             ),
