public function copyFile(
        PhingFile $sourceFile,
        PhingFile $destFile,
        Project $project,
        $overwrite = false,
        $preserveLastModified = true,
        &$filterChains = null,
        $mode = 0755,
        $preservePermissions = true
    ) {
        if ($overwrite || !$destFile->exists() || $destFile->lastModified() < $sourceFile->lastModified()) {
            if ($destFile->exists() && ($destFile->isFile() || $destFile->isLink())) {
                $destFile->delete();
            }

            // ensure that parent dir of dest file exists!
            $parent = $destFile->getParentFile();
            if ($parent !== null && !$parent->exists()) {
                // Setting source directory permissions to target
                // (On permissions preservation, the target directory permissions
                // will be inherited from the source directory, otherwise the 'mode'
                // will be used)
                $dirMode = ($preservePermissions ? $sourceFile->getParentFile()->getMode() : $mode);

                $parent->mkdirs($dirMode);
            }

            if ((is_array($filterChains)) && (!empty($filterChains))) {
                $in = self::getChainedReader(new BufferedReader(new FileReader($sourceFile)), $filterChains, $project);
                $out = new BufferedWriter(new FileWriter($destFile));

                // New read() methods returns a big buffer.
                while (-1 !== ($buffer = $in->read())) { // -1 indicates EOF
                    $out->write($buffer);
                }

                if ($in !== null) {
                    $in->close();
                }
                if ($out !== null) {
                    $out->close();
                }

                // Set/Copy the permissions on the target
                if ($preservePermissions === true) {
                    $destFile->setMode($sourceFile->getMode());
                }
            } else {
                // simple copy (no filtering)
                $sourceFile->copyTo($destFile);

                // By default, PHP::Copy also copies the file permissions. Therefore,
                // re-setting the mode with the "user file-creation mask" information.
                if ($preservePermissions === false) {
                    $destFile->setMode(FileUtils::getDefaultFileCreationMask(false));
                }
            }

            if ($preserveLastModified && !$destFile->isLink()) {
                $destFile->setLastModified($sourceFile->lastModified());
            }
        }
    }