/**
 * The base class for validators to be used to validate {@link Ext.data.Field fields} in
 * a {@link Ext.data.Model model}.
 *
 * The model will call the {@link #validate} method, which may be overridden by subclasses.
 */
Ext.define('Ext.data.validator.Validator', {
    mixins: [
        'Ext.mixin.Factoryable'
    ],
 
    alias: 'data.validator.base',  // also configures Factoryable
 
    isValidator: true,
 
    factoryConfig: {
        cacheable: true
    },
 
    /**
     * @property {String} type
     * A string representation of this format.
     */
    type: 'base',
 
    /**
     * Creates new Validator.
     * @param {Object/Function} config A config object. A function may also be passed,
     * which will be used as the {@link #validate} method for this validator.
     */
    constructor: function(config) {
        if (typeof config === 'function') {
            this.fnOnly = true;
            this.validate = config;
        } else {
            this.initConfig(config);
        }
    },
 
    /**
     * Validates the passed value.
     * @param {Object} value The value
     * @param {Ext.data.Model} record The record
     * @return {Boolean/String} `true` if the value is valid. A string may be returned if the value
     * is not valid, to indicate an error message. Any other non `true` value indicates the value
     * is not valid.
     */
    validate: function() {
        return true;
    },
 
    /**
     * Creates a copy of this validator
     * @private
     * @return {Ext.data.validator.Validator} The clone
     */
    clone: function() {
        var me = this;
 
        if (me.fnOnly) {
            return new Ext.data.validator.Validator(me.validate);
        }
 
        return new me.self(me.getCurrentConfig());
    }
},
function (Validator) {
    Ext.Factory.validator = Ext.Factory.dataValidator;
});