package Alzabo::Runtime::Column;

use strict;
use vars qw($VERSION);

use Alzabo::Runtime;
use Params::Validate qw( :all );
Params::Validate::validation_options( on_fail => sub { Alzabo::Exception::Params->throw( error => join '', @_ ) } );

use base qw(Alzabo::Column);

$VERSION = 2.0;

sub alias_clone
{
    my $self = shift;

    my %p = validate( @_, { table => { isa => 'Alzabo::Runtime::Table' },
                          } );

    my $clone;

    %$clone = %$self;
    $clone->{table} = $p{table};

    bless $clone, ref $self;

    return $clone;
}

sub alias
{
    my $self = shift;
    my %p = validate( @_, { as => { type => SCALAR } } );

    my $clone;
    %$clone = %$self;

    bless $clone, ref $self;

    $clone->{alias_name} = $p{as};
    $clone->{real_column} = $self;

    return $clone;
}

sub alias_name
{
    return $_[0]->{alias_name} || $_[0]->{name};
}

1;

__END__

=head1 NAME

Alzabo::Runtime::Column - Column objects

=head1 SYNOPSIS

  use Alzabo::Runtime::Column;

=head1 DESCRIPTION

This object represents a column.  It holds data specific to a column.

=head1 INHERITS FROM

C<Alzabo::Column>


Note: all relevant documentation from the superclass has been merged into this document.

=head1 METHODS

=head2 table

Returns the table object to which this column belongs.

=head2 name

Returns the column's name as a string.

=head2 nullable

Returns a boolean value indicating whether or not NULLs are allowed in
this column.

=head2 attributes

A column's attributes are strings describing the column (for example,
valid attributes in MySQL are 'UNSIGNED' or 'ZEROFILL'.

This method returns a list of strings of such strings.

=head2 has_attribute

This method can be used to test whether or not a column has a
particular attribute.  By default, the check is case-insensitive.

It takes the following parameters:

=over 4

=item * attribute => $attribute

=item * case_sensitive => 0 or 1 (defaults to 0)

=back

It returns a boolean value indicating whether or not the column has
this particular attribute.

=head2 type

Returns the column's type as a string.

=head2 sequenced

The meaning of a sequenced column varies from one RDBMS to another.
In those with sequences, it means that a sequence is created and that
values for this column will be drawn from it for inserts into this
table.  In databases without sequences, the nearest analog for a
sequence is used (in MySQL the column is given the AUTO_INCREMENT
attribute, in Sybase the identity attribute).

In general, this only has meaning for the primary key column of a
table with a single column primary key.  Setting the column as
sequenced means its value never has to be provided to when calling
C<Alzabo::Runtime::Table-E<gt>insert>.

Returns a boolean value indicating whether or not this column is
sequenced.

=head2 default

Returns the default value of the column as a string, or undef if there
is no default.

=head2 default_is_raw

Returns true if the default is intended to be provided to the DBMS
as-is, without quoting, fore example C<NOW()> or C<current_timestamp>.

=head2 length

Returns the length attribute of the column, or undef if there is none.

=head2 precision

Returns the precision attribute of the column, or undef if there is
none.

=head2 is_primary_key

Returns a boolean value indicating whether or not this column is part
of its table's primary key.

=head2 is_numeric

Returns a boolean value indicating whether the column is a numeric
type column.

=head2 is_integer

Returns a boolean value indicating whether the column is a numeric
type column.

=head2 is_floating_point

Returns a boolean value indicating whether the column is a numeric
type column.

=head2 is_character

Returns a boolean value indicating whether the column is a character
type column.

This is true only for any columns which are defined to hold I<text>
data, regardless of size.

=head2 is_date

Returns a boolean value indicating whether the column is a date type
column.

=head2 is_datetime

Returns a boolean value indicating whether the column is a datetime
type column.

=head2 is_time

Returns a boolean value indicating whether the column is a time type
column.

=head2 is_time_interval

Returns a boolean value indicating whether the column is a time
interval type column.

=head2 is_blob

Returns a boolean value indicating whether the column is a blob
column.

This is true for any columns defined to hold binary data, regardless
of size.

=head2 generic_type

This methods returns one of the following strings:

=over 4

=item integer

=item floating_point

=item character

=item date

=item datetime

=item time

=item blob

=item unknown

=back

=head2 definition

The definition object is very rarely of interest.  Use the
L<C<type()>|type> method if you are only interested in the column's
type.


This methods returns the
L<C<Alzabo::Runtime::ColumnDefinition>|Alzabo::Runtime::ColumnDefinition> object which
holds this column's type information.

=head2 comment

Returns the comment associated with the column object, if any.

=head2 alias

Takes the following parameters:

=over 4

=item * as => $name

=back

This method returns an object that can be used in calls to the table
and schema C<select()> methods in order to change the name given to
the column if C<next_as_hash()> is called on the
L<C<Alzabo::DriverStatement>|Alzabo::Driver/Alzabo::DriverStatment>
returned by the aforementioned C<select()> method.

=head1 AUTHOR

Dave Rolsky, <autarch@urth.org>

=cut


syntax highlighted by Code2HTML, v. 0.9.1