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