       type: 'Boolean'
 ###
 module.exports = class AbstractTypeAttributes
-  merge: (attrs)->
+  merge: (attrs)->@mergeTo attrs, @
+  mergeTo: (attrs, dest)->
     for name, attr of attrs
       attr = type:attr if isString attr
-      vAttr = @[name]
+      vAttr = dest[name]
       if vAttr is undefined
-        @[name] = attr
+        dest[name] = attr
       else
         vAttr[k] = v for k, v of attr
-    return
+    return dest
   _initialize: (aOptions)-> @merge(aOptions)
   initialize: (aOptions)->
     @_initialize(aOptions)

isFunction      = require 'util-ex/lib/is/type/function'
defineProperty  = require 'util-ex/lib/defineProperty'
getObjectKeys   = Object.keys

###
  Usage 1:

                k += "\n #{v.name}: #{v.message}"
              dest.errors = vType.errors if dest.errors
            throw new TypeError k
        if !isFunction(vAttr.assign) or !vAttr.assign(dest, src, vValue, k)
          dest[k] = vValue
    return dest
  toObject: ->
    result = {}
    for k,v of @names
      result[v.name || k] = v
    result
  isOriginal: (aObject)->
    result = true
    for k,v of @names
      continue if k is 'name'
      value = aObject[k] or aObject[v]
      #continue unless aObject.hasOwnProperty(k) or aObject.hasOwnProperty(v)
      unless value is undefined or value is @[k].value
        result = false
        break
    result
  getNames: ->
    result = {}
    for k in getOwnPropertyNames @
      v = @[k]
      result[k] = v.name || k
    result
