snowyu/object-type.js

View on GitHub
src/value.coffee

Summary

Maintainability
Test Coverage
inherits        = require 'inherits-ex/lib/inherits'
extend          = require 'util-ex/lib/extend'
isString        = require 'util-ex/lib/is/type/string'
defineProperty  = require 'util-ex/lib/defineProperty'
Value           = require 'abstract-type/value'

getOwnPropertyNames = Object.getOwnPropertyNames
getObjectKeys = Object.keys

module.exports = class ObjectValue
  inherits ObjectValue, Value

  constructor: ->return super
  _initialize: (aValue, aType, aOptions)->
    for k, attr of @$type.attributes.value()
      continue if k[0] is '$'
      vName = attr.name || k
      attr = extend {enumerable: true}, attr, (k,v)-> v isnt undefined
      defineProperty @, vName, undefined, attr
  _assign:(aValue)->
    #if isString aValue
    #  aValue = JSON.parse aValue
    if @$type.strict
      if aValue?
        for k, t of @$type.attributes.value()
          continue if k[0] is '$'
          v = aValue[k]
          @[k] = v if v isnt undefined and t.isValid v
    else
      extend @, aValue, (k)-> k[0] isnt '$'
    return
  toString: -> @$type.toString()
  valueOf: -> @
  _toObject: (aOptions)->
    aValue = @
    result = {}
    vMeta = @$type.attributes.value()
    vStrict = @$type.strict
    for vName in getObjectKeys aValue
      continue if vName[0] is '$'
      if !vStrict or (vMeta and (vType = vMeta[vName]))
        result[vName] = @[vName] unless @[vName] is undefined
    result