aasm/lib/aasm/persistence.rb

52 lines
1.6 KiB
Ruby

module AASM
module Persistence
class << self
def load_persistence(base)
# Use a fancier auto-loading thingy, perhaps. When there are more persistence engines.
hierarchy = base.ancestors.map {|klass| klass.to_s}
if hierarchy.include?("ActiveRecord::Base")
require_persistence :active_record
include_persistence base, :active_record
elsif hierarchy.include?("Mongoid::Document")
require_persistence :mongoid
include_persistence base, :mongoid
elsif hierarchy.include?("Sequel::Model")
require_persistence :sequel
include_persistence base, :sequel
elsif hierarchy.include?("Dynamoid::Document")
require_persistence :dynamoid
include_persistence base, :dynamoid
elsif hierarchy.include?("Redis::Objects")
require_persistence :redis
include_persistence base, :redis
elsif hierarchy.include?("CDQManagedObject")
include_persistence base, :core_data_query
else
include_persistence base, :plain
end
end
private
def require_persistence(type)
require File.join(File.dirname(__FILE__), 'persistence', "#{type}_persistence")
end
def include_persistence(base, type)
base.send(:include, constantize("#{capitalize(type)}Persistence"))
end
def capitalize(string_or_symbol)
string_or_symbol.to_s.split('_').map {|segment| segment[0].upcase + segment[1..-1]}.join('')
end
def constantize(string)
AASM::Persistence.const_get(string)
end
end # class << self
end
end # AASM