Author: spadkins
Date: Thu May 25 10:43:41 2006
New Revision: 6340
Modified:
p5ee/trunk/App-Repository/lib/App/Repository.pm
p5ee/trunk/App-Repository/t/DBI-repobjects.t
Log:
add support for qualified classes on a single table
Modified: p5ee/trunk/App-Repository/lib/App/Repository.pm
==============================================================================
--- p5ee/trunk/App-Repository/lib/App/Repository.pm (original)
+++ p5ee/trunk/App-Repository/lib/App/Repository.pm Thu May 25 10:43:41 2006
@@ -1105,16 +1105,21 @@
my ($self, $table, $params, $cols, $options) = @_;
die "get_object(): params undefined" if (!defined $params);
my $tabledef = $self->{table}{$table};
- my $class = $tabledef->{class} || "App::RepositoryObject";
- App->use($class);
+
my ($object);
- if (ref($cols) eq "ARRAY" && $#$cols == -1 && !ref($params)) {
- $object = {};
- }
- else {
+ #if (ref($cols) eq "ARRAY" && $#$cols == -1 && !ref($params)) {
+ # $object = {};
+ #}
+ #else {
$object = $self->get_hash($table, $params, $cols, $options);
- }
+ #}
+
if ($object) {
+ my $class = $tabledef->{class} || "App::RepositoryObject";
+ # if $class is an ARRAY ref, we need to examine the qualifier(s) to determine the class
+ $class = $self->_get_qualified_class($class, $object) if (ref($class));
+ App->use($class);
+
$object->{_repository} = $self;
$object->{_table} = $table;
bless $object, $class;
@@ -1181,15 +1186,20 @@
&App::sub_entry if ($App::trace);
my ($self, $table, $params, $cols, $options) = @_;
my $tabledef = $self->{table}{$table};
- my $class = $tabledef->{class} || "App::RepositoryObject";
- App->use($class);
my $objects = $self->get_hashes($table, $params, $cols, $options);
my $primary_key = $tabledef->{primary_key};
$primary_key = [$primary_key] if (ref($primary_key) eq "");
- my ($key);
+ my ($key, $class, %used);
foreach my $object (@$objects) {
$object->{_repository} = $self;
$object->{_table} = $table;
+ $class = $tabledef->{class} || "App::RepositoryObject";
+ # if $class is an ARRAY ref, we need to examine the qualifier(s) to determine the class
+ $class = $self->_get_qualified_class($class, $object) if (ref($class));
+ if (!$used{$class}) {
+ App->use($class);
+ $used{$class} = 1;
+ }
bless $object, $class;
if ($primary_key) {
$key = undef;
@@ -1214,6 +1224,28 @@
return($objects);
}
+sub _get_qualified_class {
+ &App::sub_entry if ($App::trace);
+ my ($self, $class_table, $object) = @_;
+ my ($class);
+ if (ref($class_table) eq "ARRAY") {
+ my ($qual, $qual_regexp, $qual_class);
+ foreach my $qual_condition (@$class_table) {
+ ($qual, $qual_regexp, $qual_class) = @$qual_condition;
+ next if (!$qual_class);
+ if ((!$qual) ||
+ (!$qual_regexp && ! $object->{$qual}) ||
+ ($object->{$qual} && $object->{$qual} =~ /$qual_regexp/)) {
+ $class = $qual_class;
+ last;
+ }
+ }
+ }
+ $class ||= "App::RepositoryObject";
+ &App::sub_exit($class) if ($App::trace);
+ return($class);
+}
+
#############################################################################
# get_hash_of_values_by_key()
#############################################################################
@@ -1711,7 +1743,6 @@
my ($self, $table, $cols, $row, $options) = @_;
my $tabledef = $self->{table}{$table};
- my $class = $tabledef->{class} || "App::RepositoryObject";
my $ref = ref($cols);
my ($object);
@@ -1731,6 +1762,9 @@
$object = {};
}
+ my $class = $tabledef->{class} || "App::RepositoryObject";
+ # if $class is an ARRAY ref, we need to examine the qualifier(s) to determine the class
+ $class = $self->_get_qualified_class($class, $object) if (ref($class));
App->use($class);
bless $object, $class;
$object->_init();
Modified: p5ee/trunk/App-Repository/t/DBI-repobjects.t
==============================================================================
--- p5ee/trunk/App-Repository/t/DBI-repobjects.t (original)
+++ p5ee/trunk/App-Repository/t/DBI-repobjects.t Thu May 25 10:43:41 2006
@@ -12,6 +12,7 @@
},
);
+
use Test::More qw(no_plan);
use lib "../App-Context/lib";
use lib "../../App-Context/lib";
@@ -20,6 +21,18 @@
use App;
use App::Repository;
+use App::RepositoryObject;
+
+package App::RepositoryObject::Man;
+@ISA = ("App::RepositoryObject");
+$VERSION = 0.01;
+
+package App::RepositoryObject::Woman;
+@ISA = ("App::RepositoryObject");
+$VERSION = 0.01;
+
+package main;
+
use strict;
if (!$App::options{dbuser}) {
@@ -40,6 +53,10 @@
dbpass => $App::options{dbpass},
table => {
test_person => {
+ class => [
+ [ "gender", "F", "App::RepositoryObject::Woman" ],
+ # [ undef, undef, "App::RepositoryObject::Man" ], # otherwise Man
+ ],
primary_key => ["person_id"],
},
},
@@ -108,6 +125,7 @@
#####################################################################
{
my $obj = $rep->get_object("test_person", 1);
+ isa_ok($obj, "App::RepositoryObject", "stephen");
$first_name = $obj->get("first_name");
is($first_name, "stephen", "get() first_name [$first_name]");
is($obj->set("first_name", "steve"),1,"set() first name [steve]");
@@ -129,6 +147,7 @@
{
my $obj = $rep->get_object("test_person", 2, []);
+ isa_ok($obj, "App::RepositoryObject", "susan");
ok($obj->set(["first_name","age"], ["sue",38]), "set() 2 values");
($first_name, $age) = $obj->get(["first_name","age"]);
is($first_name, "sue", "get() 2 values (checking 1 of 2)");
@@ -136,8 +155,15 @@
}
{
+ my $obj = $rep->get_object("test_person", 2);
+ isa_ok($obj, "App::RepositoryObject::Woman", "susan");
+}
+
+{
my $objs = $rep->get_objects("test_person", {}, undef, {order_by => "person_id"});
is($objs->[0]{_key}, 1, "get_objects() automatically set the _key");
+ isa_ok($objs->[0], "App::RepositoryObject", "by get_objects(), stephen");
+ isa_ok($objs->[1], "App::RepositoryObject::Woman", "by get_objects(), susan");
}
{
@@ -169,10 +195,11 @@
is($obj3->{first_name},$obj->{first_name}, "new.first_name seems ok");
is($obj3->{age},$obj->{age}, "new.age seems ok");
is($obj3->{_key},$obj->{_key}, "new._key seems ok");
- my $obj4 = $rep->new_object("test_person",{first_name => "christine"});
+ my $obj4 = $rep->new_object("test_person",{first_name => "christine", gender => "F"});
is($obj4->{first_name},"christine", "new.first_name (2) seems ok");
is($obj4->{_key},8, "new._key is ok");
is($obj4->{person_id},8, "new.person_id is ok");
+ isa_ok($obj4, "App::RepositoryObject::Woman", "by new_object(), christine");
}
{
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.