(function(e,t){typeof define=="function"&&define.amd?define(["underscore","backbone"],t):e.StoreHouse=t(_,Backbone)})(this,function(e,t){var n=function(e){this._configure(e||{}),this.initialize.apply(this,arguments)};e.extend(n.prototype,t.Events,{initialize:function(){},_configure:function(t){this.options&&(t=e.extend({},this.options,t)),this.options=t}}),n.extend=t.Model.extend;var r={},i=n.extend({options:{cleanInterval:9e5},initialize:function(){this.store={},this.startCleanLoop()},get:function(e){return this.store[e]?(this.retain(e),this.store[e].value):undefined},set:function(e,t){return this.store[e]={value:t,retainCount:1},this},retain:function(e){return++this.store[e].retainCount,this},release:function(e){return--this.store[e].retainCount,this},retainCount:function(e){return this.store[e].retainCount},clean:function(){var t=e.map(this.store,function(e,t){if(e.retainCount<=0)return t});return this.dispose(t),this},dispose:function(t){return e.isArray(t)||(t=[t]),e.each(t,function(e){delete this.store[e]},this),this},startCleanLoop:function(){var e=this;setTimeout(function(){e.clean().startCleanLoop()},this.options.cleanInterval)}},{of:function(e){return r[e]||(r[e]=new i),r[e]}});return i});