(function(exports){exports.andro={tearDown:function(owner){if(isSetup(owner)){this.eventer(owner).unbindAll();delete owner.andro}},augment:function(owner,behaviourMixin,settings){if(behaviourMixin===undefined){throw"You must pass a behaviour with which to augment the owner."}setupIfNotSetup(owner);var behaviour={};owner.andro.behaviours.push(behaviour);extend(behaviour,behaviourMixin);if(behaviour.setup!==undefined){settings=settings||{};var exports=behaviour.setup(owner,owner.andro.eventer,settings);for(var name in exports){if(owner[name]===undefined){owner[name]=makeFn(exports[name],behaviour)}else{throw"Behaviour export would overwrite existing attribute on owner."}}}},eventer:function(owner){setupIfNotSetup(owner);return owner.andro.eventer}};var setupIfNotSetup=function(owner){if(!isSetup(owner)){owner.andro={};owner.andro.behaviours=[];owner.andro.eventer=new Eventer}};var isSetup=function(owner){return owner.andro!==undefined};var extend=function(target,extensions){for(var property in extensions){if(extensions[property]&&extensions[property].constructor&&extensions[property].constructor===Object){target[property]=extend(target[property]||{},extensions[property])}else{target[property]=extensions[property]}}return target};var makeFn=function(fn,behaviour){return function(){return fn.apply(behaviour,arguments)}};function Eventer(){this.callbacks={}}Eventer.prototype={bind:function(obj,event,callback){this.callbacks[event]=this.callbacks[event]||[];this.callbacks[event].push({obj:obj,callback:callback});return this},unbind:function(obj,event){for(var i=0;i