Openure = {
  allViews: [],
  currentView: "",
  listener: "",
  trackedViewsIDs: [],
  previousView: null,
  stackSize: 0,
  maxStackSize: 30,

  findViewsInArray: function(array) {
  //for x in array.len....
    //this.findViewsInView(region.currentView);
  },

  registerView: function(view) {
    if (view.cid && _.lastIndexOf(this.trackedViewsIDs, view.cid) == -1) {
      this.trackedViewsIDs.push(view.cid);
      this.allViews.push(view);
    }
  },

  findViewsInObject: function(obj) {
    this.stackSize++;
    if (this.stackSize < this.maxStackSize) {
      for(var prop in obj) {
        if(obj.nodeName) {
          //this is an html element, and continuing will blow up
          return;
        }

        if (obj[prop] instanceof Backbone.View) {
          this.registerView(obj[prop]);
          this.findViewsInObject(obj[prop]);
        } else if (obj[prop] instanceof Array) {
          this.findViewsInArray(obj[prop]);
        } else if (obj[prop] instanceof Function) {
          //skip
        } else if (obj[prop] instanceof Object) {
          this.findViewsInObject(obj[prop]);
        }
      }
    }
    this.stackSize--;
  },

  applySelectedView: function() {
    clearInterval(this.listener);
    console.log("rock the view - " + this.currentView.cid);

    //Remove the current console when clicking a new one.
    if($('#console').length) {
      this.previousView.el.removeChild($('#console')[0]);
    }

    //For now, close it by clicking the same view again.
    if(this.previousView && this.previousView.cid === this.currentView.cid){
      this.previousView = null;
      return;
    }

    var jqconsole = document.createElement('div');

    var width = this.currentView.$el.css('width');
    width = width.substr(0, width.indexOf('px')); //pull off the px
    var consoleWidth = parseInt(width, 10) - 5;
    jqconsole.style.cssText = 'width:' + consoleWidth + 'px;z-index:99';
    jqconsole.id = "console";

    this.currentView.el.appendChild(jqconsole);

    // Creating the console.
    var header = 'Welcome to Openure in JQConsole!\n' +
      'The variable "view" is now in context\n' +
      'here and in the chrome console.\n' +
      'As is model, collection, and options.\n';
    this.jqconsole = $('#console').jqconsole(header, 'JS> ');

    // Abort prompt on Ctrl+Z.
    this.jqconsole.RegisterShortcut('Z', function() {
      this.jqconsole.AbortPrompt();
      handler();
    });

    // Move to line start Ctrl+A.
    this.jqconsole.RegisterShortcut('A', function() {
      this.jqconsole.MoveToStart();
      handler();
    });

    // Move to line end Ctrl+E.
    this.jqconsole.RegisterShortcut('E', function() {
      this.jqconsole.MoveToEnd();
      handler();
    });

    this.jqconsole.RegisterMatching('{', '}', 'brace');
    this.jqconsole.RegisterMatching('(', ')', 'paran');
    this.jqconsole.RegisterMatching('[', ']', 'bracket');

    isObject = function(obj) {
      return obj === Object(obj);
    };

    // Handle a command.
    var handler = _.bind(function(command) {
      var result;
      if (command) {
        try {
          result = window.eval(command);
        } catch (e) {
          this.jqconsole.Write('ERROR: ' + e.message + '\n');
        }
        try {
          if(isObject(result)) {
            result = JSON.stringify(result, function(k, v) {
              return (k === '$el' || k === 'el' || k === '_events' || k === '_listeners') ? undefined : v;
            }, 2);
          }
        } catch (e) {
          if (e.message === 'Converting circular structure to JSON') {
            this.jqconsole.Write('ERROR: ' + e.message + '\n');
            this.jqconsole.Write('Please try the same command in the chrome console.\n');
          }
          else {
            this.jqconsole.Write('ERROR: ' + e.message + '\n');
          }
        }

        this.jqconsole.Write(result);
        this.jqconsole.Write('\n');
      }
      this.jqconsole.Prompt(true, handler, function(command) {
        // Continue line if can't compile the command.
        try {
          Function(command);
        } catch (e) {
          if (/[\[\{\(]$/.test(command)) {
            return 1;
          } else {
            return 0;
          }
        }
        return false;
      });
    }, this);

    // Initiate the first prompt.
    handler();

    model = this.currentView.model;
    view = this.currentView;
    collection = this.currentView.collection;
    options = this.currentView.options;
    this.previousView = view;
  },

  go: function() {
    var openureKey = $('openure_keys');
    if(openureKey.length < 1 || openureKey.text() === ""){
      console.log('No Openure keys are configured.  Go to the Chrome extensions page and add the key to the Openure options page.');
      return;
    }
    console.log('Running Openure against global variable: ' + openureKey.text());
    this.findViewsInObject(eval(openureKey.text()));

    _.each(this.allViews, function(view) {
      view.$el[0].addEventListener('click', _.bind(function(e) {
        if(e.metaKey && e.shiftKey) {
          var ownIt = _.bind(this.applySelectedView, this);

          clearInterval(this.listener);
          this.listener = setInterval(ownIt, 100);

          e.preventDefault();
          this.currentView = view;
        }
      }, this), true);
    }, this);
  }
};

$(function () {
  Openure.go();
});

@@ -4522,32 +4522,48 @@
 %0A  go: function(
+backbone_app_key
 ) %7B%0A    var open
@@ -4597,16 +4597,17 @@
 %0A    if(
+(
 openureK
@@ -4648,16 +4648,33 @@
  === %22%22)
+ && !openure_key)
 %7B%0A      
@@ -4804,32 +4804,96 @@
 ');%0A    
-  return
+%7D%0A    else %7B%0A        backbone_app_key = openureKey.text() %7C%7C openure_key
 ;%0A    %7D%0A
     cons
@@ -4880,24 +4880,25 @@
 _key;%0A    %7D%0A
+%0A
     console.
@@ -4947,33 +4947,32 @@
 le: ' + 
-openureKey.text()
+backbone_app_key
 );%0A    t
@@ -4998,33 +4998,32 @@
 ct(eval(
-openureKey.text()
+backbone_app_key
 ));%0A%0A   

make local dev a bit easier