Polymer paper-input custom validator issue
<p>I am trying to implement a custom validator for a paper-input.  In this particular case, the control should accept positive numbers.  However, not only only will the control only accept positive numbers, it will also run some other custom validation logic to determine if the entry falls within a constantly changing (dynamic &amp; calculated) upper and lower limit.  Ideally, the paper-input control's error-message text will also change depending on what part of the custom validator check failed.</p>

<p>In the past, I was able to implement this sort of thing with the gold-email-input element.  In that case, the control checks for an entry that matches a regular expression for email addresses (i.e. implements a type-check).  It also calls a backend api to see if the email address entered (as it is being typed), already exists in a database.  If it exists in the database, the control fails validation and updates the control's validation error-message with a custom message.  If it does not exist, it passes validation.  As you might have imagined by this description, this was for a user registration UI element whereby the provided email should not already exist in the current list of user accounts.  Here is an excerpt of that working code below for your reference:</p>

<pre><code>&lt;gold-email-input id="userEmail" label="Email" required auto-validate value="{{userEmail}}" error-message$="{{_getEmailErrorMsg(0)}}" invalid="{{_emailInvalid}}" validator="_validateEmail"&gt;&lt;/gold-email-input&gt;

&lt;iron-signals on-iron-signal-email-used="_accountFound" on-iron-signal-email-available="_accountNotFound"&gt;&lt;/iron-signals&gt;

&lt;script&gt;

     var emailErrors = ["Provide a valid email address", "Address already used"];

     // Register the polymer element
     Polymer({
          properties: {
               userEmail: {type: String, value: null},
               validated: {type: Boolean, notify: true}, //overall validity state of entire element

               _emailInvalid: {type: Boolean, value: true, observer: "_validityChanged"}, // validity state of email input itself

          },

          ready: function() {
              // Called before attached
              this.$.userEmail.validate = this._validateEmail.bind(this);
          },

          _accountFound: function() {
               // Listener function intended to fire when the user email address/account was found
               console.log(this.nodeName + " accountFound listener called\n");
               this.$.userEmail.errorMessage = this._getEmailErrorMsg(1);
               this._emailInvalid = true;
          },

          _accountNotFound: function() {
               // Listener function intended to fire when the user email address/account was not found
              console.log(this.nodeName + " accountNotFound listener called\n");
              this.$.userEmail.errorMessage = this._getEmailErrorMsg(0);
              this._emailInvalid = false;
          },

          _checkAccountExistance: function() {
               if (this.userEmail !== undefined &amp;&amp; this.userEmail != null) {
                    this.$.user.checkEmailAvailability(this.userEmail);
               } else {
                    this._emailInvalid = true;
               }
          },

          _getEmailErrorMsg: function(code) {
              if (code !== undefined &amp;&amp; code != null) {
                   return emailErrors[code];
              } else {
                   return "";
              }
          },

          _validateEmail: function() {
               // Custom validator function for email input (also checks if email has already been associated to any user accounts)
               console.log(this.nodeName + " validateEmail validator called\n");

               // Check if proper email address format (W3C Spec Regex used)
               var validEntry = /^[a-zA-Z0-9.!#$%&amp;�*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(this.userEmail);

               if (validEntry) {
                    this._emailInvalid = false;
                    this._checkAccountExistance();
               } else {
                    this._emailInvalid = true;
               }
          }

          _validityChanged: function(newVal, oldVal) {
               // set the containing/parent element's overall validity state

               this.validated = (!this._nameInvalid &amp;&amp; !this._pwInvalid &amp;&amp; !this._phoneInvalid &amp;&amp; !this._emailInvalid &amp;&amp; !this._countryInvalid &amp;&amp; !this._regionInvalid &amp;&amp; !this._cityInvalid);
          },
     });
&lt;/script&gt;
</code></pre>

<p>Now, if I try to implement a similar approach with the paper-input component, it does not work.  The custom validator function does not get called at any point.  Is there something inherently different with paper-input compared to gold-email-input?  Should it not treat validation the same way?</p>

<pre><code>&lt;paper-input id="xpos" label="Horizontal Position" required auto-validate value="{{XPos}}" error-message="Provide the x position" invalid="{{_xInvalid}}" validator="_validatePosition"&gt;&lt;/paper-input&gt;

&lt;script&gt;

     // Register the polymer element
     Polymer({
          properties: {
               xPos: {type: Number},
               validated: {type: Boolean, notify: true}, //overall validity state of entire element

               _xInvalid: {type: Boolean, value: true, observer: "_validityChanged"}, // validity state of xpos input itself

          },

          ready: function() {
              // Called before attached
              this.$.xpos.validate = this._validatePosition.bind(this);
          },

          _validatePosition: function() {
               console.log(this.nodeName + " validatePosition validator called\n"); 

               // perform some validation code here like the gold-email-input example above
          }
     });
 &lt;/script&gt;
</code></pre>