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

use strict;

use DBI;
use Data::Dumper;

use Class::Indexed;
use Class::Accessor::Fast;

use base qw(Class::Accessor::Fast Class::Indexed);

my @fields = ('Pub_ID','Pub_Name','Pub_Description','Brewery_ID','Town_ID',
	      'County_ID', 'PubType_ID', 'Pub_Street', 'Pub_Address',
	      'Pub_Postcode', 'Pub_Telephone', 'Pub_Website', 'Pub_Email',);

testclass->mk_accessors(@fields);

sub new {
    my $class = shift;
    my %options = @_;
    my $self = { map { $_ => $options{$_} } @fields };
    bless ($self, ref($class) || $class);
    return $self;
}


sub Index {
    my $self = shift;
    unless ($self->{index_ready}) {
	$self->_dbconnect();
	$self->indexed_fields (
			       dbh=>$self->{_dbh}, key=>'Pub_ID',
			       fields=>[
					{ name=>'Pub_Name', weight=>2.5 },
					{ name=>'Pub_Description', weight=>0.75 },
					{ name=>'Town_ID', weight=>0.2, lookup=>'Town_Name', lookup_table=>'Town', },
					{ name=>'PubType_ID', weight=>0.5, lookup=>'PubType_Keywords', lookup_table=>'PubType', },
				       ],
			      );
	$self->{index_ready} = 1;
    }
    $self->index_object();
}

sub Store {
    my $self = shift;
    my $dbh = $self->_dbconnect();
    my $query;
    my @values;
    if ($self->Pub_ID) {
	# update database
	my (@updates);
	foreach (@fields) {
	    if (defined $self->{$_}) {
		push (@updates," $_ = ? ");
		push (@values,$self->{$_});
	    }
	}
	push (@values, $self->{Pub_ID});
	$query = 'update Pub set ' .join(', ',@updates). ' where Pub_ID = ?';
	warn "query : $query , values : @values ";
	my $sth = $dbh->prepare($query);
	my $rv = $sth->execute(@values);
    } else {
	# add to database
	my (@usedfields,@placeholders);
	foreach (@fields) {
	    if (defined $self->{$_}) {
		push (@placeholders,'? ');
		push (@usedfields,$_);
		push (@values,$self->{$_});
	    }
	}
	$query = 'insert into Pub ('.join(', ',@usedfields) . ') values ('. join(', ',@placeholders) . ')';
	warn "query : $query , values : @values ";

	my $sth = $dbh->prepare($query);
	my $rv = $sth->execute(@values);

	$self->{Pub_ID} ||= $sth->{'mysql_insertid'};

	$self->add_location( Title => $self->{Pub_Name}, Type => 'Pub', Key => 'Pub_ID', KeyValue => $self->{Pub_ID},
			     URL => "url/to/pubid=".$self->{Pub_ID}, Summary => 'summary goes here',);

    }

    # index
    $self->Index;

    return $self->{Pub_ID};
}

sub Delete {
    my $self = shift;
    $self->delete_location();
    return 1;
}

sub _dbconnect {
    my $self = shift;
    unless ( ref $self->{_dbh} ) {
	my $dbh = DBI->connect("dbi:mysql:testclass:localhost", 'testclass', 'foo');
	$self->{_dbh} = $dbh;
	return $dbh;
    } else {
	return $self->{_dbh};
    }
}


1;