view lib/IMPL/SQL/Schema/Column.pm @ 418:3f38dabaf5cc ref20150831

sync
author cin
date Mon, 28 Dec 2015 15:11:35 +0300
parents 3ed0c58e9da3
children
line wrap: on
line source

use strict;

package IMPL::SQL::Schema::Column;

use IMPL::lang qw( :base :compare :hash );
use IMPL::Exception();
use IMPL::Const qw(:prop);
use IMPL::declare {
	require => {
		SchemaType => '-IMPL::SQL::Schema::Type'
	},
	base => [
		'IMPL::Object'           => undef,
	],
	props => [
		name         => PROP_RO | PROP_DIRECT,
		type         => PROP_RO | PROP_DIRECT,
		isNullable   => PROP_RO | PROP_DIRECT,
		defaultValue => PROP_RO | PROP_DIRECT,
		tag          => PROP_RO | PROP_DIRECT
	]
};

sub CTOR {
	my ( $this, %args ) = @_;

	$this->$_( $args{$_} )
	  foreach grep exists $args{$_}, qw( name type isNullable defaultValue tag);

	$this->{$name} or
	  die new IMPL::InvalidArgumentException('A column name is required');

	$this->{$isNullable} ||= 0;    # if not exists $this->{$isNullable};

	is( $this->{$type}, SchemaType )
	  or die new IMPL::InvalidArgumentException(
		'a type is required for the column',
		$this->{$name} );
}

sub SameValue {
	my ( $this, $other ) = @_;

	return (  $this->{$name} eq $other->{$name}
		  and $this->{$isNullable} == $other->{$isNullable}
		  and equals_s( $this->{$defaultValue}, $other->{$defaultValue} )
		  and $this->{$type}->SameValue( $other->{$type} ) );
}

sub SetType {
	my ( $this, $newType ) = @_;

	$this->{$type} = $newType;
}

sub SetDefaultValue {
	my ( $this, $value ) = @_;

	$this->{$defaultValue} = $value;
}

sub SetNullable {
	my ( $this, $value ) = @_;

	$this->{$isNullable} = $value;
}

sub SetOptions {
	my ( $this, $diff ) = @_;

	return unless ref $diff eq 'HASH';

	$this->tag( {} ) unless $this->tag;

	hashApply( $this->tag, $diff );
}

1;