##----------------------------------------------------------------------------
## Database Object Interface - ~/lib/DB/Object/Fields/Unknown.pm
## Version v0.1.0
## Copyright(c) 2022 DEGUEST Pte. Ltd.
## Author: Jacques Deguest <jack@deguest.jp>
## Created 2022/12/21
## Modified 2022/12/21
## All rights reserved
## 
## This program is free software; you can redistribute  it  and/or  modify  it
## under the same terms as Perl itself.
##----------------------------------------------------------------------------
package DB::Object::Fields::Unknown;
BEGIN
{
    use strict;
    use warnings;
    use parent qw( Module::Generic );
    use vars qw( $VERSION );
    use overload (
        # '""' => \&as_string,
        'bool'  => sub{$_[0]},
        '+'     => sub{ $_[0] },
        '-'     => sub{ $_[0] },
        '*'     => sub{ $_[0] },
        '/'     => sub{ $_[0] },
        '%'     => sub{ $_[0] },
        '<'     => sub{ $_[0] },
        '>'     => sub{ $_[0] },
        '<='    => sub{ $_[0] },
        '>='    => sub{ $_[0] },
        '!='    => sub{ $_[0] },
        '<<'    => sub{ $_[0] },
        '>>'    => sub{ $_[0] },
        '&'     => sub{ $_[0] },
        '^'     => sub{ $_[0] },
        '|'     => sub{ $_[0] },
        '=='    => sub{ $_[0] },
        fallback => 1,
    );
    our $VERSION = 'v0.1.0';
};

use strict;
use warnings;

sub init
{
    my $self = shift( @_ );
    $self->{error} = undef;
    $self->{field} = undef;
    $self->{table} = undef;
    $self->{_init_strict_use_sub} = 1;
    $self->SUPER::init( @_ ) || return( $self->pass_error );
    return( $self );
}

sub as_string { return( shift->error->scalar ); }

sub error { return( shift->_set_get_scalar_as_object( 'error', @_ ) ); }

sub field { return( shift->_set_get_scalar_as_object( 'field', @_ ) ); }

sub table { return( shift->_set_get_scalar_as_object( 'table', @_ ) ); }

1;
# NOTE: POD
__END__

=encoding utf-8

=head1 NAME

DB::Object::Fields::Unknown - Unknown Field Class

=head1 SYNOPSIS

    use DB::Object::Fields::Unknown;
    my $f = DB::Object::Fields::Unknown->new(
        table => 'some_table',
        error => 'Table some_table has no such field \"some_field\".',
    ) || die( DB::Object::Fields::Unknown->error, "\n" );

=head1 VERSION

    v0.1.0

=head1 DESCRIPTION

This class represents an unknown field. This happens when L<DB::Object::Fields> cannot find a given field used in a SQL query. Instead of returning an error (undef), it returns this object, which is then ignored when he query is formulated.

A warning is issued by L<DB::Object::Fields> when a field is unknown, so make sure to check your error output or your error log.

=head1 METHODS

=head2 as_string

Returns the error message as a regular string.

=head2 error

Sets or gets the error that triggered this new object.

This returns the error as a L<string object|Module::Generic::Scalar>

=head2 field

Sets or gets the name of the unknown field.

This returns the field name as a L<string object|Module::Generic::Scalar>

=head2 table

Sets or gets the name of the table associated with this unknown field

This returns the table name as a L<string object|Module::Generic::Scalar>

=head1 AUTHOR

Jacques Deguest E<lt>F<jack@deguest.jp>E<gt>

=head1 SEE ALSO

L<DB::Object::Fields>, L<DB::Object::Fields::Field>, L<DB::Object::Query>

=head1 COPYRIGHT & LICENSE

Copyright(c) 2022 DEGUEST Pte. Ltd.

All rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

=cut