text: // --------- This code has been automatically generated !!! 2016-10-20T16:36:05.754Z
  "use strict";
  require("requirish")._(module);
  /**
   * @module opcua.address_space.types
   */
  var assert = require("better-assert");
  var util = require("util");
  var _  = require("underscore");
  var makeNodeId = require("lib/datamodel/nodeid").makeNodeId;
  var schema_helpers =  require("lib/misc/factories_schema_helpers");
  var extract_all_fields                       = schema_helpers.extract_all_fields;
  var resolve_schema_field_types               = schema_helpers.resolve_schema_field_types;
  var initialize_field                         = schema_helpers.initialize_field;
  var initialize_field_array                   = schema_helpers.initialize_field_array;
  var check_options_correctness_against_schema = schema_helpers.check_options_correctness_against_schema;
  var _defaultTypeMap = require("lib/misc/factories_builtin_types")._defaultTypeMap;
  var ec = require("lib/misc/encode_decode");
  var encodeArray = ec.encodeArray;
  var decodeArray = ec.decodeArray;
  var makeExpandedNodeId = ec.makeExpandedNodeId;
  var generate_new_id = require("lib/misc/factories").generate_new_id;
  var _enumerations = require("lib/misc/factories_enumerations")._private._enumerations;
  var schema = require("../schemas/ModificationInfo_schema").ModificationInfo_Schema;
  var BaseUAObject = require("lib/misc/factories_baseobject").BaseUAObject;
  
  //## Define special behavior for Enumeration
  var _enum_properties = {
      "updateType": {
          hidden: false,
          enumerable: true,
          configurable: false,
              get: function() {
                  return this.$updateType;
              },
              set: function(value) {
                  var coercedValue = _enumerations.HistoryUpdateType.typedEnum.get(value);
                  /* istanbul ignore next */
                  if ( coercedValue === undefined || coercedValue === null) {
                        throw new Error("value cannot be coerced to HistoryUpdateType: " + value);
                  }
                  this.$updateType = coercedValue;
              }
      },
      "$updateType": {
           configurable: false,
           value: 'aaaa',
           hidden: true,
           writable: true,
           enumerable: false
      },
  };
  
  
  /**
   * 
   * @class ModificationInfo
   * @constructor
   * @extends BaseUAObject
   * @param  options {Object}
   * @param  [options.username] {String} The name of the user that made the modification. Support for this field is optional. A null shall be returned if it is not defined.
   * @param  [options.modificationTime] {UtcTime}  The time the modification was made. Support for this field is optional. A null shall be returned if it is not defined.
   * @param  [options.updateType] {HistoryUpdateType}  The modification type for the item.
   */
  function ModificationInfo(options)
  {
      options = options || {};
      /* istanbul ignore next */
      if (schema_helpers.doDebug) { check_options_correctness_against_schema(this,schema,options); }
      var self = this;
      assert(this instanceof BaseUAObject); //  ' keyword "new" is required for constructor call')
      resolve_schema_field_types(schema);
  
      BaseUAObject.call(this,options);
  
      /**
        * The name of the user that made the modification. Support for this field is optional. A null shall be returned if it is not defined.
        * @property username
        * @type {String}
        */
      self.username = initialize_field(schema.fields[0], options.username);
  
      /**
        *  The time the modification was made. Support for this field is optional. A null shall be returned if it is not defined.
        * @property modificationTime
        * @type {UtcTime}
        */
      self.modificationTime = initialize_field(schema.fields[1], options.modificationTime);
  
      /**
        *  The modification type for the item.
        * @property updateType
        * @type {HistoryUpdateType}
        */
      self.updateType = initialize_field(schema.fields[2], options.updateType);
  
     // Object.preventExtensions(self);
  }
  util.inherits(ModificationInfo,BaseUAObject);
  
  //define enumeration properties
  Object.defineProperties(ModificationInfo.prototype,_enum_properties);
  ModificationInfo.prototype.encodingDefaultBinary = makeExpandedNodeId(11226,0);
  ModificationInfo.prototype.encodingDefaultXml = makeExpandedNodeId(11218,0);
  ModificationInfo.prototype._schema = schema;
  
  var encode_String = _defaultTypeMap.String.encode;
  var decode_String = _defaultTypeMap.String.decode;
  var encode_UtcTime = _defaultTypeMap.UtcTime.encode;
  var decode_UtcTime = _defaultTypeMap.UtcTime.decode;
  var encode_HistoryUpdateType = _enumerations.HistoryUpdateType.encode;
  var decode_HistoryUpdateType = _enumerations.HistoryUpdateType.decode;
  /**
   * encode the object into a binary stream
   * @method encode
   *
   * @param stream {BinaryStream} 
   */
  ModificationInfo.prototype.encode = function(stream,options) {
      // call base class implementation first
      BaseUAObject.prototype.encode.call(this,stream,options);
      encode_String(this.username,stream);
      encode_UtcTime(this.modificationTime,stream);
      encode_HistoryUpdateType(this.updateType,stream);
  };
  ModificationInfo.prototype.decode = function(stream,options) {
      // call base class implementation first
      BaseUAObject.prototype.decode.call(this,stream,options);
      this.username = decode_String(stream,options);
      this.modificationTime = decode_UtcTime(stream,options);
      this.updateType = decode_HistoryUpdateType(stream,options);
  };
  ModificationInfo.possibleFields = (function() {
      return [
          "username",
           "modificationTime",
           "updateType"
      ];
  })();
  
  
  exports.ModificationInfo = ModificationInfo;
  var register_class_definition = require("lib/misc/factories_factories").register_class_definition;
  register_class_definition("ModificationInfo",ModificationInfo);
  