diff --git a/iron-validatable-behavior.html b/iron-validatable-behavior.html
index 803731b..0be57aa 100644
--- a/iron-validatable-behavior.html
+++ b/iron-validatable-behavior.html
@@ -46,10 +46,11 @@
properties: {
/**
- * Name of the validator to use.
+ * Name of the validator to use, or the validating function.
+ * @type {string|function(Object):boolean}
*/
validator: {
- type: String
+ type: Object
},
/**
@@ -140,9 +141,20 @@
return true;
},
- __computeValidator: function() {
- return Polymer.IronValidatableBehaviorMeta &&
- Polymer.IronValidatableBehaviorMeta.byKey(this.validator);
+ /**
+ * Retrieves the validator.
+ *
+ * @param {string|function(Object):boolean} validator
+ * The validator name or function.
+ * @return {!{validate: function(Object):boolean}} The validator.
+ */
+ __computeValidator: function(validator) {
+ if (typeof validator === 'function') {
+ return {validate: validator};
+ } else {
+ return Polymer.IronValidatableBehaviorMeta &&
+ Polymer.IronValidatableBehaviorMeta.byKey(validator);
+ }
}
};
diff --git a/test/iron-validatable-behavior.html b/test/iron-validatable-behavior.html
index a8040ef..96df9b2 100644
--- a/test/iron-validatable-behavior.html
+++ b/test/iron-validatable-behavior.html
@@ -74,13 +74,17 @@
input.validator = 'cats-only';
assert.isFalse(input.validate('ca'));
assert.isTrue(input.validate('cats'));
+
+ // Only valid if the value is 'lizards'.
+ input.validator = (value) => value === 'lizards';
+ assert.isFalse(input.validate('cats'));
+ assert.isTrue(input.validate('lizards'));
// Only valid if the value is 'dogs'.
input.validator = 'dogs-only';
assert.isFalse(input.validate('cats'));
assert.isTrue(input.validate('dogs'));
});
-
});