public function perform()
	{
		$this->guardAgainstImpossibleMove();

		if ( $this->fireMoveEvent( 'moving' ) === false )
			return $this->model;

		if ( $this->hasChange() )
		{
			$self = $this;

			$this->model->getConnection()->transaction( function () use ( $self )
			{
				$self->updateStructure();
			} );

			$this->target->reload();

			$this->model->setDepthWithSubtree();

			$this->model->reload();
		}

		$this->fireMoveEvent( 'moved', false );

		return $this->model;
	}