   @param {Object} obj
   ###
   constructor: (obj) ->
-    @_id            = "#{obj.id || ""}"
-    @_rubicVersion  = "#{obj.rubicVersion || ""}"
-    @_friendlyName  = I18n.parseJSON(obj.friendlyName)
-    @_beta          = !!obj.beta
-    @_obsolete      = !!obj.obsolete
-    @_firmwares     = (Firmware.parseJSON(f) for f in (obj.firmwares or []))
+    super(obj)
     return
 
   ###*

  ###*
  @template
  @static
  @property {string} langName
    Name of programming language
  @readonly
  ###
  @classProperty("langName", get: -> null)

  ###*
  @template
  @static
  @property {string[]} suffixes
    Array of suffixes
  ###
  @classProperty("suffixes", get: -> null)

  ###*
  @property {string} id
    ID of engine
  @readonly
  ###
  @property("id", get: -> @_id)

  ###*
  @property {string} rubicVersion
    Supported Rubic version
  @readonly
  ###
  @property("rubicVersion", get: -> @_rubicVersion)

  ###*
  @property {I18n} friendlyName
    The name of engine
  @readonly
  ###
  @property("friendlyName", get: -> @_friendlyName)

  ###*
  @property {boolean} beta
    Is a beta feature?
  @readonly
  ###
  @property("beta", get: -> @_beta)

  ###*
  @property {boolean} obsolete
    Is an obsolete feature?
  @readonly
  ###
  @property("obsolete", get: -> @_obsolete)

  ###*
  @property {Firmware[]} firmware
    Array of firmwares
  @readonly
  ###
  @property("firmwares", get: -> f for f in @_firmwares)

  #--------------------------------------------------------------------------------
  # Public methods

"use strict"
# Pre dependencies
JSONable = require("./jsonable")

