text: var colors = require('./colors');
  
  module['exports'] = function () {
  
    //
    // Extends prototype of native string object to allow for "foo".red syntax
    //
    var addProperty = function (color, func) {
      String.prototype.__defineGetter__(color, func);
    };
  
    var sequencer = function sequencer (map, str) {
        return function () {
          var exploded = this.split(""), i = 0;
          exploded = exploded.map(map);
          return exploded.join("");
        }
    };
  
    addProperty('strip', function () {
      return colors.strip(this);
    });
  
    addProperty('stripColors', function () {
      return colors.strip(this);
    });
  
    addProperty("trap", function(){
      return colors.trap(this);
    });
  
    addProperty("zalgo", function(){
      return colors.zalgo(this);
    });
  
    addProperty("zebra", function(){
      return colors.zebra(this);
    });
  
    addProperty("rainbow", function(){
      return colors.rainbow(this);
    });
  
    addProperty("random", function(){
      return colors.random(this);
    });
  
    addProperty("america", function(){
      return colors.america(this);
    });
  
    //
    // Iterate through all default styles and colors
    //
    var x = Object.keys(colors.styles);
    x.forEach(function (style) {
      addProperty(style, function () {
        return colors.stylize(this, style);
      });
    });
  
    function applyTheme(theme) {
      //
      // Remark: This is a list of methods that exist
      // on String that you should not overwrite.
      //
      var stringPrototypeBlacklist = [
        '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__', 'charAt', 'constructor',
        'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf', 'charCodeAt',
        'indexOf', 'lastIndexof', 'length', 'localeCompare', 'match', 'replace', 'search', 'slice', 'split', 'substring',
        'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight'
      ];
  
      Object.keys(theme).forEach(function (prop) {
        if (stringPrototypeBlacklist.indexOf(prop) !== -1) {
          console.log('warn: '.red + ('String.prototype' + prop).magenta + ' is probably something you don\'t want to override. Ignoring style name');
        }
        else {
          if (typeof(theme[prop]) === 'string') {
            colors[prop] = colors[theme[prop]];
            addProperty(prop, function () {
              return colors[theme[prop]](this);
            });
          }
          else {
            addProperty(prop, function () {
              var ret = this;
              for (var t = 0; t < theme[prop].length; t++) {
                ret = colors[theme[prop][t]](ret);
              }
              return ret;
            });
          }
        }
      });
    }
  
    colors.setTheme = function (theme) {
      if (typeof theme === 'string') {
        try {
          colors.themes[theme] = require(theme);
          applyTheme(colors.themes[theme]);
          return colors.themes[theme];
        } catch (err) {
          console.log(err);
          return err;
        }
      } else {
        applyTheme(theme);
      }
    };
  
  };
  