Javascript Inventor - library design

by gschutz

HTML

<script src="https://rawgit.com/lodash/lodash/3.10.1/lodash.js"></script>

JavaScript

;(function(root, factory) {
  if (typeof define === 'function' && define.amd) {
    define(factory);
  } else if (typeof exports === 'object') {
    module.exports = factory();
  } else {
    root.Classy = factory();
  }
}(this, function() {
    
    function ClassyWrapper(name) {
        this.name = name;
    }
    
    var Classy = this.Classy = function (name) {
        Classy[name] = Classy.invent;
        
		Classy[_.capitalize(name)] = Classy[name]({
           create: name,
           inherit: Classy.Resource
		});
        
        return new Classy[_.capitalize(name)](name);
    }
    
    Classy.create = function(name) {
        return new ClassyWrapper(name);
    }
    
   Classy.invent = function(config) {
  	/* create element initializer */
	//var ctx = typeof config.create == 'function' ?  : config.create;
  	var init = typeof config.create == 'function' ?
  		config.create :
  		function() {
  			this.constructor.call(this, Classy.create(config.create));
  		};
  
  	/* inherit prototype */
  	if (config.inherit)
  		init.prototype = new config.inherit;
  
  	return init;
   }
   
   Classy.Wrapper = Classy.invent({
       create: function(wrapper) {
           _.assign(this, wrapper);
       }
   });
   
   Classy.Resource = Classy.invent({
       create: "Resource",
       inherit: Classy.Wrapper
   });
   
   Classy.People = Classy.invent({
       create: "Resource",
       inherit: Classy.Resource
   });
   
   Classy.User = Classy.invent({
       create: "Resource",
       inherit: Classy.People
   });
    
    


	return Classy;
}));



var world = Classy("world");

console.log(world);
console.log([world]);