     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, skipDefaultValue)
+        @assignPropertyTo(dest, @, k, @[k], vAttrs, skipDefault, isExported)
     dest
 
   exportTo: (dest, aExclude, skipDefault, skipReadOnly)->
-    if isString aExclude
-      aExclude = [aExclude]
-    else if isBoolean aExclude
-      skipReadOnly = skipDefault
-      skipDefault = aExclude
-      aExclude = []
-    else if not isArray aExclude
-      aExclude = []
-    dest?= {}
-    skipDefault?= true
-
-    vAttrs = @getProperties()
-    for k,v of vAttrs
-      continue if k[0] is '$'
-      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, true)
-    dest
+    skipDefault?=true
+    @mergeTo(dest, aExclude, skipDefault, skipReadOnly, true)
 
   toObject: (options)->
     @exportTo(options)

    @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 = []

getkeys         = Object.keys

module.exports  = class AbstractPropertyManager

  nonExported1stChar: '$'

  constrcutor: ->
    @initialize.apply @, arguments
