validate(opts) {
        let model = this;
        let hasValidated,
            type,
            validator;

        opts = opts || {};

        if (opts.model) {
            model = opts.model;
        } else if (this instanceof Model) {
            model = this;
        } else if (this.model) {
            model = this.model;
        }

        type = this.validationType || model.validationType;
        validator = this.get(`validators.${type}`) || model.validators[type];
        hasValidated = this.hasValidated;

        opts.validationType = type;

        return new RSVP.Promise((resolve, reject) => {
            let passed;

            if (!type || !validator) {
                return reject([`The validator specified, "${type}", did not exist!`]);
            }

            if (opts.property) {
                // If property isn't in `hasValidated`, add it to mark that this field can show a validation result
                hasValidated.addObject(opts.property);
                model.errors.remove(opts.property);
            } else {
                model.errors.clear();
            }

            passed = validator.check(model, opts.property);

            return (passed) ? resolve() : reject();
        });
    }
Passes the model to the validator specified by validationType.
Returns a promise that will resolve if validation succeeds, and reject if not.
Some options can be specified:

`model: Object` - you can specify the model to be validated, rather than pass the default value of `this`,
                  the class that mixes in this mixin.

`property: String` - you can specify a specific property to validate. If
					   no property is specified, the entire model will be
					   validated