<?php

namespace Doctrine\ORM\Event;

use Doctrine\Common\EventArgs,
    Doctrine\ORM\EntityManager;

/**
 * Class that holds event arguments for a preInsert/preUpdate event.
 *
 * @author Roman Borschel <roman@code-factory.org>
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 * @since 2.0
 */
class PreUpdateEventArgs extends LifecycleEventArgs
{
    /**
     * @var array
     */
    private $_entityChangeSet;

    /**
     *
     * @param object $entity
     * @param EntityManager $em
     * @param array $changeSet
     */
    public function __construct($entity, $em, array &$changeSet)
    {
        parent::__construct($entity, $em);
        $this->_entityChangeSet = &$changeSet;
    }

    public function getEntityChangeSet()
    {
        return $this->_entityChangeSet;
    }

    /**
     * Field has a changeset?
     *
     * @return bool
     */
    public function hasChangedField($field)
    {
        return isset($this->_entityChangeSet[$field]);
    }

    /**
     * Get the old value of the changeset of the changed field.
     * 
     * @param  string $field
     * @return mixed
     */
    public function getOldValue($field)
    {
    	$this->_assertValidField($field);

        return $this->_entityChangeSet[$field][0];
    }

    /**
     * Get the new value of the changeset of the changed field.
     *
     * @param  string $field
     * @return mixed
     */
    public function getNewValue($field)
    {
        $this->_assertValidField($field);

        return $this->_entityChangeSet[$field][1];
    }

    /**
     * Set the new value of this field.
     * 
     * @param string $field
     * @param mixed $value
     */
    public function setNewValue($field, $value)
    {
        $this->_assertValidField($field);

        $this->_entityChangeSet[$field][1] = $value;
    }

    private function _assertValidField($field)
    {
    	if (!isset($this->_entityChangeSet[$field])) {
            throw new \InvalidArgumentException(
                "Field '".$field."' is not a valid field of the entity ".
                "'".get_class($this->getEntity())."' in PreInsertUpdateEventArgs."
            );
        }
    }
}