public function run($destination, $source, $default = null)
    {
        $result = null;

        if (is_object($destination) && is_object($source) && get_class($destination) == get_class($source)) {
            $result = $this->mergeObject($destination, $source);
        } elseif (is_array($source) && is_array($destination)) {
            $result = $this->mergeArray($destination, $source);
        } elseif (!is_null($source) && $source !== $default) {
            $result = $source;
        }

        return $result;
    }