lib/maintain/backend.rb in maintain-0.2.1 vs lib/maintain/backend.rb in maintain-0.2.2
- old
+ new
@@ -1,12 +1,31 @@
require 'maintain/backend/base'
module Maintain
module Backend
class << self
+ def add(name, owner)
+ classes[name.to_sym] = owner
+ modules = owner.split('::')
+ if Object.const_defined?(modules.first) && owner = Object.const_get(modules.shift)
+ while modules.length > 0
+ owner = owner.const_get(modules.shift)
+ end
+ if owner.is_a? Module
+ owner.class_eval do
+ class << self
+ include Maintain
+ end
+ end
+ else
+ owner.extend Maintain
+ end
+ end
+ end
+
def build(back_end, maintainer)
- back_end = back_end.split('_').map(&:capitalize).join('')
+ back_end = back_end.to_s.split('_').map(&:capitalize).join('')
if constants.include? back_end.to_s
const_get(back_end.to_sym).new
else
begin
back_end = const_missing(back_end)
@@ -14,10 +33,14 @@
rescue
end
end
end
+ def classes
+ @classes ||= {}
+ end
+
def const_missing(constant)
underscore_constant = constant.to_s.dup
underscore_constant.gsub!(/::/, '/')
underscore_constant.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
underscore_constant.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
@@ -27,9 +50,26 @@
require("maintain/backend/#{underscore_constant}")
const_get(constant)
rescue
super
end
+ end
+
+ # Detect if we've loaded a backend for this class - that means if its ancestors or
+ # parent classes include any of our back-end classes.
+ def detect(owner)
+ ancestors = owner.ancestors.map(&:to_s)
+ # While owner does not refer to "Object"
+ while owner.superclass
+ ancestors.push(owner.to_s)
+ owner = owner.superclass
+ end
+ classes.each do |back_end, class_name|
+ if ancestors.include? class_name
+ return back_end
+ end
+ end
+ nil
end
end
end
end