Sha256: de3bf43bd1df9274d7e2223b9262150f234503956257e54b15de2afa4d12d4c0

Contents?: true

Size: 1.43 KB

Versions: 2

Compression:

Stored size: 1.43 KB

Contents

require 'adapter/asserts'
require 'adapter/defaults'
require 'adapter/exceptions'

module Adapter
  extend self
  extend Asserts

  # Stores the definitions for each adapter by name
  def definitions
    @definitions ||= {}
  end

  def define(name, mod=nil, &block)
    definition_module = Module.new
    definition_module.send(:include, Defaults)
    definition_module.send(:include, mod) unless mod.nil?
    definition_module.send(:include, Module.new(&block)) if block_given?
    assert_valid_module(definition_module)
    adapters.delete(name.to_sym)
    definitions[name.to_sym] = definition_module
  end

  # Memoizes adapter instances based on their definitions
  def adapters
    @adapters ||= {}
  end

  def [](name)
    assert_valid_adapter(name)
    adapters[name.to_sym] ||= get_adapter_instance(name)
  end

  private
    def get_adapter_instance(name)
      Class.new do
        attr_reader :client, :options

        def initialize(client, options={})
          @client = client
          @options = options
        end

        include Adapter.definitions[name.to_sym]

        alias_method :get, :read
        alias_method :set, :write

        alias_method :[], :read
        alias_method :[]=, :write

        alias_method :get_multiple, :read_multiple

        def eql?(other)
          self.class.eql?(other.class) && client == other.client
        end
        alias == eql?

        class_eval "def name; :#{name} end"
      end
    end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
adapter-0.6.3 lib/adapter.rb
adapter-0.6.2 lib/adapter.rb