The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package VSGDR::SQLServer::DataType;

use 5.010;
use strict;
use warnings;


#our \$VERSION = '1.01';
use Carp;
use parent qw(Clone);

use overload        (
        q("")   => sub {$_[0]->{VALUE}}, 
        q(0+)   => sub {$_[0]->{VALUE}},
        '<=>'   => \&spaceship,
        'cmp'   => \&spaceship,
);


our %Types      =   ( Bit       => 1
                    , Generic   => 1
                    ) ;


sub new {

    local $_ ;

    my $invocant         = shift ;
    my $class            = ref($invocant) || $invocant ;

    my @elems            = @_ ;
    my $self             = bless {}, $class ;

    $self->_init(@elems) ;
    return $self ;
}


sub _init {

    local $_ ;

    my $self                = shift ;
    my $class               = ref($self) || $self ;
    my $arg                 = shift ;##  can''t check undef !or croak "no _init arg";

    my $Value               = $arg;
    $self->setValue(${Value} ) ; 

    return ;
    
}

sub setValue {

    local $_ ;

    my $self                = shift ;
    my $arg                 = shift ;##  can''t check undef or croak "no setValue arg";
    $self->{VALUE}          = $arg ;
        
}

sub value {

    local $_ ;

    my $self                = shift ;
    return scalar $self->{VALUE} ;
        
}

## parent type - do nothing
sub quoteValue {
    local $_ ;
    my $self                = shift ;
    my $value               = shift ;
    return                  $value ;
}

## parent type - do nothing
sub unQuoteValue {
    local $_ ;
    my $self                = shift ;
    my $value               = shift ;
    return                  $value ;
}


sub make {

    local $_ ;
    my $self            = shift ;
    my $flagthing       = shift or croak 'No object type' ;
    
    my $objectType ;
    if ( $flagthing == -7 ) {
        $objectType = 'Bit';
    }
    else {
        $objectType = 'Generic';
    }
    croak "Invalid SQL Server Data Type" unless exists $Types{${objectType}};
    
    require "VSGDR/SQLServer/DataType/${objectType}.pm";
    return "VSGDR::SQLServer::DataType::${objectType}"->new(@_) ;

}


sub spaceship { 
    my ($s1, $s2, $inverted) = @_;

return 0 if ( ! defined $s1->value() ) or ( ! defined $s2->value() ) ;
    return $inverted ? $s2->value() cmp $s1->value() : $s1->value() cmp $s2->value() ;
} 


1 ;

__DATA__