def self.new(name, options = {})
expires = options[:expires]
options.delete(:expires) unless Integer === expires
logger = options.delete(:logger)
threadsafe = options.delete(:threadsafe)
compress = options.delete(:compress)
serializer = options.include?(:serializer) ? options.delete(:serializer) : :marshal
key_serializer = options.include?(:key_serializer) ? options.delete(:key_serializer) : serializer
value_serializer = options.include?(:value_serializer) ? options.delete(:value_serializer) : serializer
transformer = { :key => [key_serializer, :prefix], :value => [value_serializer], :prefix => options.delete(:prefix) }
transformer[:value] << (Symbol === compress ? compress : :zlib) if compress
raise ArgumentError, 'Name must be Symbol' unless Symbol === name
case name
when :Sequel
transformer[:key] << :base64
when :ActiveRecord, :DataMapper, :Couch
transformer[:key] << :base64
transformer[:value] << :base64
when :PStore, :YAML, :Null
transformer.delete(:value) if transformer[:value] == [:marshal]
when :HashFile
transformer[:key] << :md5 << :spread
name = :File
when :File, :Riak, :RestClient
transformer[:key] << :escape
end
a = Adapters.const_get(name).new(options)
build do
use :Logger, Hash === logger ? logger : {} if logger
use :Expires, :expires => options[:expires] if !a.supports?(:expires) && expires
use :Transformer, transformer
use :Lock if threadsafe
adapter a
end
end