<?php
 
/**
 
 * @package DATA
 
 */
 
 
/**
 
 * ANSI SQL Integer data type representation.
 
 * 
 
 * When inboxing, if the field cannot hold the desired value
 
 * {@link DATA_InvalidInt} is thrown.
 
 */
 
class DATA_SQLInt extends DATA_SQLType implements DATA_Number {
 
    /**
 
     * The stored number.
 
     * @var int
 
     */
 
    protected $number;
 
    
 
    /**
 
     * Construct a sql integer type with an initial value (optional).
 
     * 
 
     * Throws {@link DATA_InvalidInt} when the number to be stored is invalid.
 
     * 
 
     * @param boolean $nullable True if the type is nullable.
 
     * @param null|int|string $number The stored number.
 
     */
 
    public function __construct($nullable, $number = 0) {
 
        $this->setNumber($number);
 
        parent::__construct($nullable, is_null($number));
 
    }
 
    
 
    /**
 
     * Returns the stored number.
 
     * 
 
     * @return int The stored number.
 
     */
 
    public function getNumber() {
 
        return $this->number;
 
    }
 
    
 
    /**
 
     * Sets the stored number.
 
     * 
 
     * Throws {@link DATA_InvalidInt} when the number to be stored is invalid.
 
     * 
 
     * @param int|string $number The stored number.
 
     */
 
    public function setNumber($number) {
 
        if (is_string($number)) {
 
            $toInt = (int)$number;
 
            if ((string)$toInt !== $number) {
 
                throw new DATA_InvalidInt($number);
 
            }
 
        }
 
        $this->number = (int)$number;
 
        $this->setNotNull();
 
    }
 
    
 
    public function setNull() {
 
        parent::setNull();
 
        $this->number = null;
 
    }
 
    
 
    public function __toString() {
 
        return (string)$this->number;
 
    }
 
    
 
    public function outbox() {
 
        return $this->number;
 
    }
 
    
 
    /**
 
     * Adds this int to another and returns the result.
 
     * 
 
     * Throws {@link DATA_InvalidInt}.
 
     * 
 
     * @param DATA_Number $other The number to add.
 
     * @return DATA_SQLInt The result.
 
     */
 
    public function add(DATA_Number $other) {
 
        return new DATA_SQLInt($this->isNullable(), $this->number + $other->getNumber());
 
    }
 
    
 
    /**
 
     * Substracts this int to another and returns the result.
 
     * 
 
     * Throws {@link DATA_InvalidInt}.
 
     * 
 
     * @param DATA_Number $other The number to substract.
 
     * @return DATA_SQLInt The result.
 
     */
 
    public function substract(DATA_Number $other) {
 
        return new DATA_SQLInt($this->isNullable(), $this->number - $other->getNumber());
 
    }
 
    
 
    /**
 
     * Multiplies this int to another and returns the result.
 
     * 
 
     * Throws {@link DATA_InvalidInt}.
 
     * 
 
     * @param DATA_Number $other The number to multiply by.
 
     * @return DATA_SQLInt The result.
 
     */
 
    public function multiply(DATA_Number $other) {
 
        return new DATA_SQLInt($this->isNullable(), $this->number * $other->getNumber());
 
    }
 
    
 
    /**
 
     * Divides this int to another and returns the result.
 
     * 
 
     * Throws {@link DATA_InvalidInt}.
 
     * 
 
     * @param DATA_Number $other The number to divide by.
 
     * @return DATA_SQLInt The result.
 
     */
 
    public function divide(DATA_Number $other) {
 
        return new DATA_SQLInt($this->isNullable(), (int)($this->number / $other->getNumber()));
 
    }
 
}
 
?>
 
 
 |