| 'use strict'; | 
|   | 
| var YAMLException = require('./exception'); | 
|   | 
| var TYPE_CONSTRUCTOR_OPTIONS = [ | 
|   'kind', | 
|   'resolve', | 
|   'construct', | 
|   'instanceOf', | 
|   'predicate', | 
|   'represent', | 
|   'defaultStyle', | 
|   'styleAliases' | 
| ]; | 
|   | 
| var YAML_NODE_KINDS = [ | 
|   'scalar', | 
|   'sequence', | 
|   'mapping' | 
| ]; | 
|   | 
| function compileStyleAliases(map) { | 
|   var result = {}; | 
|   | 
|   if (map !== null) { | 
|     Object.keys(map).forEach(function (style) { | 
|       map[style].forEach(function (alias) { | 
|         result[String(alias)] = style; | 
|       }); | 
|     }); | 
|   } | 
|   | 
|   return result; | 
| } | 
|   | 
| function Type(tag, options) { | 
|   options = options || {}; | 
|   | 
|   Object.keys(options).forEach(function (name) { | 
|     if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { | 
|       throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); | 
|     } | 
|   }); | 
|   | 
|   // TODO: Add tag format check. | 
|   this.tag          = tag; | 
|   this.kind         = options['kind']         || null; | 
|   this.resolve      = options['resolve']      || function () { return true; }; | 
|   this.construct    = options['construct']    || function (data) { return data; }; | 
|   this.instanceOf   = options['instanceOf']   || null; | 
|   this.predicate    = options['predicate']    || null; | 
|   this.represent    = options['represent']    || null; | 
|   this.defaultStyle = options['defaultStyle'] || null; | 
|   this.styleAliases = compileStyleAliases(options['styleAliases'] || null); | 
|   | 
|   if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { | 
|     throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); | 
|   } | 
| } | 
|   | 
| module.exports = Type; |