optimization
use native-deep-extend module
added callback function