Rewrite model_config once again.

This commit is contained in:
José Valim
2009-10-22 14:19:01 -02:00
parent d1305d48b1
commit a9c058010d
3 changed files with 39 additions and 34 deletions

View File

@@ -10,22 +10,43 @@ module Devise
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].freeze
MODEL_CONFIG = []
def self.model_config(klass, accessor, default=nil)
# Create Devise accessor
# Creates configuration values for Devise and for the given module.
#
# Devise.model_config(Devise::Authenticable, :stretches, 10)
#
# The line above creates:
#
# 1) An accessor called Devise.stretches, which value is used by default;
#
# 2) Some class methods for your model Model.stretches and Model.stretches=
# which have higher priority than Devise.stretches;
#
# 3) And an instance method stretches.
#
# To add the class methods you need to have a module ClassMethods defined
# inside the given class.
#
def self.model_config(mod, accessor, default=nil) #:nodoc:
mattr_accessor accessor
# Set default value
send(:"#{accessor}=", default)
# Store configuration method
MODEL_CONFIG << accessor
# Set default value
klass.class_eval <<-METHOD
mod.class_eval <<-METHOD, __FILE__, __LINE__
def #{accessor}
Devise.#{accessor}
self.class.#{accessor}
end
METHOD
mod.const_get(:ClassMethods).class_eval <<-METHOD, __FILE__, __LINE__
def #{accessor}
@#{accessor} || if superclass.respond_to?(:#{accessor})
superclass.#{accessor}
else
Devise.#{accessor}
end
end
def #{accessor}=(value)
@#{accessor} = value
end
METHOD
end

View File

@@ -48,10 +48,9 @@ module Devise
#
def devise(*modules)
options = modules.extract_options!
options.assert_valid_keys(:except, *Devise::MODEL_CONFIG)
modules = Devise::ALL if modules.include?(:all)
modules -= Array(options.delete(:except)) if options.key?(:except)
modules = Devise::ALL if modules.include?(:all)
modules -= Array(options.delete(:except))
modules |= [:authenticable]
modules.each do |m|
@@ -60,21 +59,7 @@ module Devise
end
# Convert new keys to methods which overwrites Devise defaults
options.each do |key, value|
case value
when Proc
define_method key, &value
next
when ActiveSupport::Duration
value = value.to_i
end
class_eval <<-END_EVAL, __FILE__, __LINE__
def #{key}
#{value.inspect}
end
END_EVAL
end
options.each { |key, value| send(:"#{key}=", value) }
end
# Stores all modules included inside the model, so we are able to verify

View File

@@ -24,9 +24,6 @@ module Devise
# User.find(1).valid_password?('password123') # returns true/false
#
module Authenticable
Devise.model_config(self, :pepper)
Devise.model_config(self, :stretches, 10)
def self.included(base)
base.class_eval do
extend ClassMethods
@@ -74,7 +71,6 @@ module Devise
end
module ClassMethods
# Authenticate a user based on email and password. Returns the
# authenticated user if it's valid or nil.
# Attributes are :email and :password
@@ -93,6 +89,9 @@ module Devise
perishable
end
end
Devise.model_config(self, :pepper)
Devise.model_config(self, :stretches, 10)
end
end
end