protected function performCopy( $source, $destination, $depth = ezcWebdavRequest::DEPTH_INFINITY )
    {
        switch ( $_SERVER['REQUEST_METHOD'] )
        {
            case 'MOVE':
                // in case performCopy() was called from a MOVE operation,
                // do a real move operation, because the move() function
                // from ezcWebdavSimpleBackend calls performCopy() and
                // performDelete()
                $errors = $this->moveRecursive( $source, $destination, $depth );
                break;

            case 'COPY':
                $errors = $this->copyRecursive( $source, $destination, $depth );
                break;

            default:
                $errors = $this->moveRecursive( $source, $destination, $depth );
                break;
        }

        // Transform errors
        foreach ( $errors as $nr => $error )
        {
            $errors[$nr] = new ezcWebdavErrorResponse(
                ezcWebdavResponse::STATUS_423,
                $error
            );
        }

        // Copy dead properties
        $storage = $this->getPropertyStorage( $source );
        $this->storeProperties( $destination, $storage );

        // Updateable live properties are updated automagically, because they
        // are regenerated on request on base of the file they affect. So there
        // is no reason to keep them "alive".

        return $errors;
    }