lib/active_adapter/engine.rb in active_adapter-0.1.0.pre vs lib/active_adapter/engine.rb in active_adapter-0.1.0
- old
+ new
@@ -1,12 +1,35 @@
module ActiveAdapter
class Engine
class << self
- def adapters
- @adapters ||= {}
- end
-
+ # To adapt engine object for a real object
+ # @param adapter [#to_sym] Adapter class name
+ # @return [Object] The real object with a adapter
+ # @raise [ActiveAdapter::AbstractAdapterUndefinedError] if there is no *_adapters folder or
+ # there is no abstract class(inherit from ActiveAdapter::Abstract) in *_adapters folder
+ # @raise [ActiveAdapter::ImplementAdapterUndefinedError] if there is no implement class
+ # inherit from ActiveAdapter::Implement)
+ # @example
+ # # vehicle.rb
+ # class Vehicle < ActiveAdapter::Engine; end
+ #
+ # # vehicle_adapters/abstract.rb
+ # class VehicleAdapters::Abstract < ActiveAdapter::Abstract
+ # def run
+ # adapter.run
+ # end
+ # end
+ #
+ # # vehicle_adapters/car.rb
+ # class VehicleAdapters::Car < ActiveAdapter::Implement
+ # def run
+ # "Car running..."
+ # end
+ # end
+ #
+ # vehicle = Vehicle.adapt(:car)
+ # vehicle.run # => "Car running..."
def adapt(adapter)
adapters[adapter.to_s] ||= begin
module_name = "#{name.deconstantize}::#{name.demodulize}Adapters"
abstract_adapter_class = get_abstract_adapter_class(module_name)
implement_adapter_class = get_implement_adapter_class(module_name, adapter)
@@ -14,9 +37,13 @@
abstract_adapter_class.new(implement_adapter_class)
end
end
private
+
+ def adapters
+ @adapters ||= {}
+ end
def get_implement_adapter_class(module_name, adapter)
"#{module_name}::#{adapter.to_s.camelize}".constantize
rescue NameError => e
raise ActiveAdapter::ImplementAdapterUndefinedError, e