define(['underscore','mageUtils','mage/utils/wrapper'],function(_,utils,wrapper){'use strict';var Class;function getOwn(obj,prop){return _.isObject(obj)&&obj.hasOwnProperty(prop)&&obj[prop];} function createConstructor(protoProps,constructor){var UiClass=constructor;if(!UiClass){UiClass=function(){var obj=this;if(!_.isObject(obj)||Object.getPrototypeOf(obj)!==UiClass.prototype){obj=Object.create(UiClass.prototype);} obj.initialize.apply(obj,arguments);return obj;};} UiClass.prototype=protoProps;UiClass.prototype.constructor=UiClass;return UiClass;} Class=createConstructor({initialize:function(options){this.initConfig(options);return this;},initConfig:function(options){var defaults=this.constructor.defaults,config=utils.extend({},defaults,options||{}),ignored=config.ignoreTmpls||{},cached=utils.omit(config,ignored);config=utils.template(config,this,false,true);_.each(cached,function(value,key){utils.nested(config,key,value);});return _.extend(this,config);}});_.extend(Class,{defaults:{ignoreTmpls:{templates:true}},extend:function(extender){var parent=this,parentProto=parent.prototype,childProto=Object.create(parentProto),child=createConstructor(childProto,getOwn(extender,'constructor')),defaults;extender=extender||{};defaults=extender.defaults;delete extender.defaults;_.each(extender,function(method,name){childProto[name]=wrapper.wrapSuper(parentProto[name],method);});child.defaults=utils.extend({},parent.defaults||{});if(defaults){utils.extend(child.defaults,defaults);extender.defaults=defaults;} return _.extend(child,{__super__:parentProto,extend:parent.extend});}});return Class;});