Venciity

Class creator last Update

Nov 14th, 2014
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var className;
  2.  
  3. function capitaliseFirstLetter(string)
  4. {
  5.     return string.charAt(0).toUpperCase() + string.slice(1);
  6. }
  7.  
  8. function generateClass() {
  9.     className = document.getElementById("base-class").value;
  10.     var fields = document.getElementById("fields").value;
  11.  
  12.     var fieldTypePair = fields.split(",");
  13.  
  14.     var fieldNames = [];
  15.     var fieldTypes = [];
  16.  
  17.     for (var i = 0; i < fieldTypePair.length; i++) {
  18.         var splittedFieldType = fieldTypePair[i].split(":");
  19.         fieldNames.push(splittedFieldType[0].trim());
  20.         fieldTypes.push(splittedFieldType[1].trim());
  21.     }
  22.  
  23.     var constructorSettersString = '';
  24.  
  25.     for (var j = 0; j < fieldNames.length; j++) {
  26.         constructorSettersString += "\t\tthis.set" + capitaliseFirstLetter(fieldNames[j]) +
  27.             "(" + fieldNames[j] + ");\n";
  28.     }
  29.  
  30.     var abstractConstructor = '';
  31.  
  32.     if (document.getElementById("abstract").checked == true) {
  33.         abstractConstructor += "\t\tif (this.constructor === " + className + ") {\n\t\t\t" +
  34.             "throw new Error('Cannot instantiate abstract class " + className + ".');\n\t\t" +
  35.             "}\n";
  36.     }
  37.  
  38.     var classCode = "var " + className + " = (function () {\n" +
  39.         "\tfunction " + className + "(" + fieldNames.join(", ") + ") {\n" + abstractConstructor +
  40.         constructorSettersString + "\t}\n";
  41.  
  42.     for (var k = 0; k < fieldNames.length; k++) {
  43.         classCode += "\n";
  44.         classCode += generateGetter(fieldNames[k]);
  45.         classCode += "\n";
  46.         classCode += generateSetter(fieldNames[k], fieldTypes[k]);
  47.     }
  48.  
  49.     classCode += "\n\n\t" + className + ".prototype.toString = function () {\n\t\treturn ";
  50.  
  51.     var toStringOutput = "'" + capitaliseFirstLetter(fieldNames[0]) + ": ' + this.get" +
  52.         capitaliseFirstLetter(fieldNames[0]) + "()";
  53.  
  54.     for (var l = 1; l < fieldNames.length; l++) {
  55.         toStringOutput += " + '" + capitaliseFirstLetter(fieldNames[l]) + ": ' + " +
  56.             "this.get" + capitaliseFirstLetter(fieldNames[l]) + "()";
  57.     }
  58.  
  59.     toStringOutput += ";\n\t};";
  60.  
  61.     classCode += toStringOutput;
  62.  
  63.     classCode += "\n\n\treturn " + className + ";\n}());";
  64.  
  65.     document.getElementById("output").value = classCode;
  66. }
  67.  
  68. function generateGetter(fieldName) {
  69.     return "\t" + className + ".prototype.get" + capitaliseFirstLetter(fieldName) +
  70.         " = function() {\n\t\treturn this._" + fieldName + ";\n\t};\n";
  71. }
  72.  
  73. function generateSetter(fieldName, fieldType) {
  74.     var fieldValidator;
  75.  
  76.     if (fieldType == 'string') {
  77.             fieldValidator = '\tString.prototype.validateNonEmptyString(' + fieldName + ');\n';
  78.     } else if (fieldType == 'number') {
  79.         fieldValidator = '\tNumber.prototype.validateIsNumber(' + fieldName + ');\n';
  80.        
  81.     } else if (fieldType == 'boolean') {
  82.         fieldValidator = '\tBoolean.prototype.validateBoolean(' + fieldName + ');\n';
  83.     }
  84.  
  85.     return "\t" + className + ".prototype.set" + capitaliseFirstLetter(fieldName) + " = function(" +
  86.         fieldName + ") {\n\t" + fieldValidator +
  87.         "\t\tthis._" + fieldName + " = " + fieldName + ";\n\t};\n";
  88. }
Advertisement
Add Comment
Please, Sign In to add comment