aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/type/type_map.rb
diff options
context:
space:
mode:
authorSean Griffin <sean@thoughtbot.com>2014-05-27 10:59:22 -0700
committerSean Griffin <sean@thoughtbot.com>2014-05-27 19:44:29 -0700
commit728fa69839d2c3b839391f9077896c06df80bddf (patch)
treedab29e5d69868c8abf9a00491ca8cc0acd5d04c3 /activerecord/lib/active_record/type/type_map.rb
parent7f73b9152cfc3f218cfc862e971ba56b94f6be10 (diff)
downloadrails-728fa69839d2c3b839391f9077896c06df80bddf.tar.gz
rails-728fa69839d2c3b839391f9077896c06df80bddf.tar.bz2
rails-728fa69839d2c3b839391f9077896c06df80bddf.zip
Move types to the top level `ActiveRecord` namespace
`ActiveRecord::ConnectionAdapters::Type::Value` => `ActiveRecord::Type::Value`
Diffstat (limited to 'activerecord/lib/active_record/type/type_map.rb')
-rw-r--r--activerecord/lib/active_record/type/type_map.rb48
1 files changed, 48 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/type/type_map.rb b/activerecord/lib/active_record/type/type_map.rb
new file mode 100644
index 0000000000..88c5f9c497
--- /dev/null
+++ b/activerecord/lib/active_record/type/type_map.rb
@@ -0,0 +1,48 @@
+module ActiveRecord
+ module Type
+ class TypeMap # :nodoc:
+ def initialize
+ @mapping = {}
+ end
+
+ def lookup(lookup_key, *args)
+ matching_pair = @mapping.reverse_each.detect do |key, _|
+ key === lookup_key
+ end
+
+ if matching_pair
+ matching_pair.last.call(lookup_key, *args)
+ else
+ default_value
+ end
+ end
+
+ def register_type(key, value = nil, &block)
+ raise ::ArgumentError unless value || block
+
+ if block
+ @mapping[key] = block
+ else
+ @mapping[key] = proc { value }
+ end
+ end
+
+ def alias_type(key, target_key)
+ register_type(key) do |sql_type, *args|
+ metadata = sql_type[/\(.*\)/, 0]
+ lookup("#{target_key}#{metadata}", *args)
+ end
+ end
+
+ def clear
+ @mapping.clear
+ end
+
+ private
+
+ def default_value
+ @default_value ||= Value.new
+ end
+ end
+ end
+end