module Devise::Models::Validatable

def self.assert_validations_api!(base) #:nodoc:

:nodoc:
def self.assert_validations_api!(base) #:nodoc:
  unavailable_validations = VALIDATIONS.select { |v| !base.respond_to?(v) }
  unless unavailable_validations.empty?
    raise "Could not use :validatable module since #{base} does not respond " \
          "to the following methods: #{unavailable_validations.to_sentence}."
  end
end

def self.included(base)

def self.included(base)
  base.extend ClassMethods
  assert_validations_api!(base)
  base.class_eval do
    validates_presence_of   :email, if: :email_required?
    validates_uniqueness_of :email, allow_blank: true, case_sensitive: true, if: :devise_will_save_change_to_email?
    validates_format_of     :email, with: email_regexp, allow_blank: true, if: :devise_will_save_change_to_email?
    validates_presence_of     :password, if: :password_required?
    validates_confirmation_of :password, if: :password_required?
    validates_length_of       :password, within: password_length, allow_blank: true
  end
end

def self.required_fields(klass)

def self.required_fields(klass)
  []
end

def email_required?

def email_required?
  true
end

def password_required?

or confirmation are being set somewhere.
Passwords are always required if it's a new record, or if the password
Checks whether a password is needed or not. For validations only.
def password_required?
  !persisted? || !password.nil? || !password_confirmation.nil?
end