about summary refs log tree commit
path: root/lib/metropolis/multi_hash.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/metropolis/multi_hash.rb')
-rw-r--r--lib/metropolis/multi_hash.rb24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/metropolis/multi_hash.rb b/lib/metropolis/multi_hash.rb
new file mode 100644
index 0000000..65ed6fe
--- /dev/null
+++ b/lib/metropolis/multi_hash.rb
@@ -0,0 +1,24 @@
+# -*- encoding: binary -*-
+module Metropolis::MultiHash
+  autoload :Digest, 'metropolis/multi_hash/digest'
+  autoload :ToI, 'metropolis/multi_hash/to_i'
+
+  def self.extended(obj)
+    sym = obj.instance_eval {
+      case @multi_hash.to_s
+      when /\Ato_i/
+        extend Metropolis::MultiHash::ToI
+      when /\Adigest_/
+        extend Metropolis::MultiHash::Digest
+      when /\Atdb_hash_/
+        extend TDB::HashFunctions
+      end
+      @multi_hash
+    }
+    obj.respond_to?(sym) or
+      raise ArgumentError, "multi_hash=#{sym} not supported"
+    (class << obj; self; end).instance_eval do
+      alias_method :multi_hash, sym
+    end
+  end
+end