| 'use strict'; | 
|   | 
| const encoders = require('./encoders'); | 
| const decoders = require('./decoders'); | 
| const inherits = require('inherits'); | 
|   | 
| const api = exports; | 
|   | 
| api.define = function define(name, body) { | 
|   return new Entity(name, body); | 
| }; | 
|   | 
| function Entity(name, body) { | 
|   this.name = name; | 
|   this.body = body; | 
|   | 
|   this.decoders = {}; | 
|   this.encoders = {}; | 
| } | 
|   | 
| Entity.prototype._createNamed = function createNamed(Base) { | 
|   const name = this.name; | 
|   | 
|   function Generated(entity) { | 
|     this._initNamed(entity, name); | 
|   } | 
|   inherits(Generated, Base); | 
|   Generated.prototype._initNamed = function _initNamed(entity, name) { | 
|     Base.call(this, entity, name); | 
|   }; | 
|   | 
|   return new Generated(this); | 
| }; | 
|   | 
| Entity.prototype._getDecoder = function _getDecoder(enc) { | 
|   enc = enc || 'der'; | 
|   // Lazily create decoder | 
|   if (!this.decoders.hasOwnProperty(enc)) | 
|     this.decoders[enc] = this._createNamed(decoders[enc]); | 
|   return this.decoders[enc]; | 
| }; | 
|   | 
| Entity.prototype.decode = function decode(data, enc, options) { | 
|   return this._getDecoder(enc).decode(data, options); | 
| }; | 
|   | 
| Entity.prototype._getEncoder = function _getEncoder(enc) { | 
|   enc = enc || 'der'; | 
|   // Lazily create encoder | 
|   if (!this.encoders.hasOwnProperty(enc)) | 
|     this.encoders[enc] = this._createNamed(encoders[enc]); | 
|   return this.encoders[enc]; | 
| }; | 
|   | 
| Entity.prototype.encode = function encode(data, enc, /* internal */ reporter) { | 
|   return this._getEncoder(enc).encode(data, reporter); | 
| }; |