 getkeys         = Object.keys
 
 module.exports  = class AbstractPropertyManager
+
+  nonExported1stChar: '$'
 
   constrcutor: ->
     @initialize.apply @, arguments

    @assignPropertyTo(@, options, name, value, attrs, skipDefaultValue)
    return

  mergeTo: (dest, aExclude, skipDefaultValue)->
    if isArray dest
      aExclude = dest
      dest = {}
    else if isBoolean dest
      skipDefaultValue = dest
      aExclude = []
      dest = {}

    if isString aExclude
      aExclude = [aExclude]
    else if isBoolean aExclude
      skipDefaultValue = aExclude
      aExclude = []
    else if not isArray aExclude
      aExclude = []

    for k,v of vAttrs
      continue if k in aExclude
      continue if v and v.name and (v.name in aExclude)
      continue if skipReadOnly and v.writable is false and !v.set
      if !dest.hasOwnProperty(k)
        @assignPropertyTo(dest, @, k, @[k], vAttrs, skipDefault, isExported)
    dest

  exportTo: (dest, aExclude, skipDefault, skipReadOnly)->
    skipDefault?=true
    @mergeTo(dest, aExclude, skipDefault, skipReadOnly, true)

  toObject: (options)->
    @exportTo(options)
