code: function(r) {
          // wait till the given DoIt is executed
          this.then(function() {
              var $this = this,
                  jn    = this.join(), // block execution of the runner
                  res   = arguments.length > 0 ? Array.prototype.slice.call(arguments) : []; // save arguments to restore it later
  
              // call "doit" we are waiting for
              r.then(function() {
                  if ($this.$error === null) {
                      // unblock the doit that waits for the runner we are in and
                      // restore its arguments
                      if (res.length > 0) {
                          jn.apply($this, res);
                      } else {
                          jn.call($this);
                      }
  
                      // preserve arguments for the next call
                      if (arguments.length > 0) {
                          this.join.apply(this, arguments);
                      }
                  }
              }).catch(function(e) {
                  // delegate error to a waiting runner
                  $this.error(e);
              });
          });
  
          return this;
      }
docs: Wait for the given doit redness.
  @param  {zebkit.DoIt} r a runner
  @example
  
  var async = new DoIt().then(function() {
  // imagine we do asynchronous ajax call
  ajaxCall("http://test.com/data", this.join());
  });
  
  var doit = new DoIt().till(async).then(function(res) {
  // handle result that has been fetched
  // by "async" do it
  ...
  });
  
  @chainable
  @method till