text: //Element object
  //Wrapper around browser methods
  var __slice = Array.prototype.slice;
  var _ = require("./lodash")
    , utils = require("./utils.js")
    , niceArgs = utils.niceArgs
    , niceResp = utils.niceResp
    , elementCommands = require('./element-commands');
  
  var Element = function(value, browser) {
    this.value = value;
    this.browser = browser;
  
    if(!value){
      throw new Error("no value passed to Element constructor");
    }
  
    if(!browser){
      throw new Error("no browser passed to Element constructor");
    }
  };
  
  Element.prototype.emit = function() {
    this.browser.emit.apply(this.browser, __slice.call(arguments, 0));
  };
  
  Element.prototype.toString = function () {
    return String(this.value);
  };
  
  Element.prototype.toJSON = function () {
    return { ELEMENT: this.value };
  };
  
  _(elementCommands).each(function(fn, name) {
    Element.prototype[name] = function() {
      var _this = this;
      var fargs = utils.varargs(arguments);
      this.emit('command', "CALL" , "element." + name + niceArgs(fargs.all));
      var cb = function(err) {
        if(err) {
          err.message = '[element.' + name + niceArgs(fargs.all) + "] " + err.message;
          fargs.callback(err);
        } else {
          var cbArgs = __slice.call(arguments, 0);
          _this.emit('command', "RESPONSE" , "element." + name + niceArgs(fargs.all),
            niceResp(_.drop(cbArgs)));
          fargs.callback.apply(null, cbArgs);
        }
      };
      var args = fargs.all.concat([cb]);
      return fn.apply(this, args);
    };
  });
  
  module.exports = Element;
  