   #   skip some properties, custom filter.
   isSame: (aOptions)->
     #deepEqual @, aOptions
-    for k,v of @mergeOptions()
+    for k,v of @mergeTo()
       return false unless deepEqual aOptions[k], v
     return true
 
   createValue: (aValue, aOptions)->
     if aOptions and not @isSame(aOptions)
-      aOptions = @mergeOptions(aOptions)
+      aOptions = @mergeTo(aOptions)
       # TODO: seperate the cache-able ability
       if isFunction Type.getCacheItem
         # this Type Factory is cache-able.

    @_assign aOptions if @_assign
    @
  # merge self to options(do not modify the original options)
  mergeOptions: (aOptions, aExclude, aSerialized)->
    aOptions = {} unless isObject aOptions

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

    if @$attributes
      for k,v of @$attributes.names
        continue if v in aExclude or aOptions.hasOwnProperty(v)
        continue if k is 'name'
        value = @[v]
        vAttr = @$attributes[k]
        vDefaultValue = vAttr.value
        continue if aSerialized and
           (k[0] is '$' or

    if isObject raiseError
      aOptions    = raiseError
      raiseError  = aOptions.raiseError
    aOptions = @mergeTo(aOptions)
    aOptions.raiseError = true if raiseError
    result = @validateRequired aValue, aOptions
    result = @_validate(aValue, aOptions) if result and aValue?
