lib/mobility/backend/orm_delegator.rb in mobility-0.1.20 vs lib/mobility/backend/orm_delegator.rb in mobility-0.2.0
- old
+ new
@@ -6,28 +6,38 @@
@example KeyValue backend for AR model
class Post < ActiveRecord::Base
# ...
end
- Mobility::Backend::KeyValue.for(Post)
- #=> Mobility::Backend::ActiveRecord::KeyValue
+ Mobility::Backends::KeyValue.for(Post)
+ #=> Mobility::Backends::ActiveRecord::KeyValue
=end
module OrmDelegator
# @param [Class] model_class Class of model
# @return [Class] Class of backend to use for model
def for(model_class)
+ namespace = name.split('::'.freeze)
if Loaded::ActiveRecord && model_class < ::ActiveRecord::Base
- const_get(name.split("::".freeze).insert(-2, "ActiveRecord".freeze).join("::".freeze))
+ require_backend("active_record", namespace.last.underscore)
+ const_get(namespace.insert(-2, "ActiveRecord".freeze).join("::".freeze))
elsif Loaded::Sequel && model_class < ::Sequel::Model
- const_get(name.split("::".freeze).insert(-2, "Sequel".freeze).join("::".freeze))
+ require_backend("sequel", namespace.last.underscore)
+ const_get(namespace.insert(-2, "Sequel".freeze).join("::".freeze))
else
- raise ArgumentError, "#{name.split('::'.freeze).last} backend can only be used by ActiveRecord or Sequel models".freeze
+ raise ArgumentError, "#{namespace.last} backend can only be used by ActiveRecord or Sequel models".freeze
end
end
- def self.included(base)
- base.extend(self)
+ private
+
+ def require_backend(orm, backend)
+ begin
+ orm_backend = "mobility/backends/#{orm}/#{backend}"
+ require orm_backend
+ rescue LoadError => e
+ raise unless e.message =~ /#{orm_backend}/
+ end
end
end
end
end