# File lib/moneta.rb, line 92
  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
      # Sequel accept only base64 keys
      transformer[:key] << :base64
    when :ActiveRecord, :DataMapper, :Couch
      # DataMapper and AR accept only base64 keys and values
      transformer[:key] << :base64
      transformer[:value] << :base64
    when :PStore, :YAML, :Null
      # For PStore and YAML only the key has to be a string
      transformer.delete(:value) if transformer[:value] == [:marshal]
    when :HashFile
      # Use spreading hashes
      transformer[:key] << :md5 << :spread
      name = :File
    when :File, :Riak, :RestClient
      # Use escaping for file and HTTP interfaces
      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