code: function(method, args, timeout) {
        // when polyfilling Object.observe, ensure changes 
        // propagate before executing the async method
        Polymer.flush();
        // second argument to `apply` must be an array
        args = (args && args.length) ? args : [args];
        // function to invoke
        var fn = function() {
          (this[method] || method).apply(this, args);
        }.bind(this);
        // execute `fn` sooner or later
        var handle = timeout ? setTimeout(fn, timeout) :
            requestAnimationFrame(fn);
        // NOTE: switch on inverting handle to determine which time is used.
        return timeout ? handle : ~handle;
      }
docs: Invokes a function asynchronously. The context of the callback
  function is bound to 'this' automatically. Returns a handle which may
  be passed to <a href="#cancelAsync">cancelAsync</a> to cancel the
  asynchronous call.
  
  @method async
  @param {Function|String} method
  @param {any|Array} args
  @param {number} timeout