Showing 8 changed files with 64 additions and 31 deletions
+2 -1
Changes
... ...
@@ -1,5 +1,6 @@
1 1
 0.1638
2
-  added experimental base_table attribute and  removed experimental table_class attribute
2
+  table object call dbi object method if not found method.
3
+  added experimental base_table attribute and removed experimental table_class attribute
3 4
   renamed helper to method.
4 5
   added experimental DBIx::Custom::Result::stash()
5 6
   renamed experimental DBIx::Custom::Table helper to method
+25 -13
lib/DBIx/Custom.pm
... ...
@@ -14,15 +14,16 @@ use DBIx::Custom::Result;
14 14
 use DBIx::Custom::Query;
15 15
 use DBIx::Custom::QueryBuilder;
16 16
 use DBIx::Custom::Where;
17
+use DBIx::Custom::Table;
17 18
 use Encode qw/encode_utf8 decode_utf8/;
18 19
 
19 20
 __PACKAGE__->attr(
20 21
     [qw/data_source dbh password user/],
21 22
     cache => 1,
22
-    dbi_option => sub { {} },
23
+    dbi_option    => sub { {} },
23 24
     query_builder => sub { DBIx::Custom::QueryBuilder->new },
24 25
     result_class  => 'DBIx::Custom::Result',
25
-    table_class   => 'DBIx::Custom::Table'
26
+    base_table    => sub { DBIx::Custom::Table->new(dbi => shift) }
26 27
 );
27 28
 
28 29
 __PACKAGE__->attr(
... ...
@@ -569,19 +570,30 @@ sub table {
569 570
     my $self = shift;
570 571
     my $name = shift;
571 572
     
572
-    # Table class
573
-    my $table_class = $self->table_class;
574
-    croak qq{Invalid table class name "$table_class"}
575
-      unless $table_class =~ /^[\w:]+$/;
576
-    unless ($table_class->can('isa')) {
577
-        eval "require $table_class";
578
-        croak $@ if $@;
579
-    }
580 573
     # Create table
581 574
     $self->{_tables} ||= {};
582
-    $self->{_tables}->{$name}
583
-        = $table_class->new(name => $name, dbi => $self)
584
-      unless defined $self->{_tables}->{$name};
575
+    unless (defined $self->{_tables}->{$name}) {
576
+        # Base table
577
+        my $base_table = $self->base_table;
578
+        
579
+        # Base methods
580
+        my $bmethods = ref $base_table->{_methods} eq 'HASH'
581
+                     ? $base_table->{_methods}
582
+                     : {};
583
+        
584
+        # Copy Methods
585
+        my $methods = {};
586
+        $methods->{$_} = $bmethods->{$_} for keys %$bmethods;
587
+        
588
+        # Create table
589
+        my $table = $base_table->new(
590
+            dbi      => $self,
591
+            name     => $name,
592
+            base     => $base_table,
593
+            _methods => $methods
594
+        );
595
+        $self->{_tables}->{$name} = $table;
596
+    }
585 597
     
586 598
     return $self->{_tables}{$name};
587 599
 }
+9 -6
lib/DBIx/Custom/Table.pm
... ...
@@ -10,7 +10,7 @@ use Carp 'croak';
10 10
 # Carp trust relationship
11 11
 push @DBIx::Custom::CARP_NOT, __PACKAGE__;
12 12
 
13
-__PACKAGE__->attr(['dbi', 'name']);
13
+__PACKAGE__->attr(['dbi', 'name', 'base']);
14 14
 
15 15
 our $AUTOLOAD;
16 16
 
... ...
@@ -22,11 +22,14 @@ sub AUTOLOAD {
22 22
 
23 23
     # Method
24 24
     $self->{_methods} ||= {};
25
-    croak qq/Can't locate object method "$mname" via "$package"/
26
-      unless my $method = $self->{_methods}->{$mname};
27
-
28
-    # Execute
29
-    return $self->$method(@_);
25
+    
26
+    # Method
27
+    if (my $method = $self->{_methods}->{$mname}) {
28
+        return $self->$method(@_)
29
+    }
30
+    
31
+    # DBI method
32
+    return $self->dbi->$mname(@_);
30 33
 }
31 34
 
32 35
 sub method {
+24 -7
t/dbix-custom-core-sqlite.t
... ...
@@ -16,7 +16,7 @@ BEGIN {
16 16
 }
17 17
 
18 18
 # Function for test name
19
-sub test { "# $_[0]\n" }
19
+sub test { print "# $_[0]\n" }
20 20
 
21 21
 # Constant varialbes for test
22 22
 my $CREATE_TABLE = {
... ...
@@ -1019,13 +1019,7 @@ is_deeply($row, {key1 => 2, key2 => 2});
1019 1019
 eval {$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2},
1020 1020
              filter => {key1 => 'no'}) };
1021 1021
 like($@, qr//);
1022
-$dbi->table_class('!!!!');
1023
-eval {$dbi->table};
1024
-like($@, qr/Invalid table/);
1025 1022
 
1026
-$dbi->table_class('NOTEXIST');
1027
-eval {$dbi->table};
1028
-ok($@);
1029 1023
 $dbi->register_filter(one => sub { });
1030 1024
 $dbi->default_fetch_filter('one');
1031 1025
 ok($dbi->default_fetch_filter);
... ...
@@ -1072,3 +1066,26 @@ $result = DBIx::Custom::Result->new;
1072 1066
 is_deeply($result->stash, {}, 'default');
1073 1067
 $result->stash->{foo} = 1;
1074 1068
 is($result->stash->{foo}, 1, 'get and set');
1069
+
1070
+test 'base_table';
1071
+$dbi = DBIx::Custom->new;
1072
+$dbi->base_table->method(
1073
+    one => sub { 1 }
1074
+);
1075
+$table = $dbi->table('book');
1076
+$table->method(
1077
+    two => sub { 2 }
1078
+);
1079
+is($dbi->base_table->one, 1, 'method');
1080
+is($table->one, 1, 'inherit method');
1081
+is($table->two, 2, 'child table method');
1082
+eval {$dbi->base_table->two};
1083
+ok($@);
1084
+
1085
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
1086
+$dbi->execute($CREATE_TABLE->{0});
1087
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
1088
+$result = $dbi->base_table->execute("select * from table1");
1089
+is_deeply($result->fetch_hash_all, [{key1 => 1, key2 => 2}], 'dbi method from base_table');
1090
+$result = $dbi->table('table1')->execute("select * from table1");
1091
+is_deeply($result->fetch_hash_all, [{key1 => 1, key2 => 2}], 'dbi method from table');
+1 -1
t/dbix-custom-core.t
... ...
@@ -7,7 +7,7 @@ use DBIx::Custom::QueryBuilder;
7 7
 
8 8
 # Function for test name
9 9
 my $test;
10
-sub test { "# $_[0]\n" }
10
+sub test { print "# $_[0]\n" }
11 11
 
12 12
 # Variables for test
13 13
 my $dbi;
+1 -1
t/dbix-custom-query.t
... ...
@@ -5,7 +5,7 @@ use warnings;
5 5
 use DBIx::Custom::Query;
6 6
 
7 7
 # Function for test name
8
-sub test{ "# $_[0]\n" }
8
+sub test{ print "# $_[0]\n" }
9 9
 
10 10
 # Variables for test
11 11
 my $query;
+1 -1
t/dbix-custom-querybuilder.t
... ...
@@ -6,7 +6,7 @@ use Test::More 'no_plan';
6 6
 use DBIx::Custom::QueryBuilder;
7 7
 
8 8
 # Function for test name
9
-sub test{ "# $_[0]\n" }
9
+sub test{ print "# $_[0]\n" }
10 10
 
11 11
 # Variable for test
12 12
 my $datas;
+1 -1
t/dbix-custom-sqlite.t
... ...
@@ -14,7 +14,7 @@ BEGIN {
14 14
 }
15 15
 
16 16
 # Function for test name
17
-sub test { "# $_[0]\n" }
17
+sub test { print "# $_[0]\n" }
18 18
 
19 19
 # Constant varialbes for test
20 20
 my $CREATE_TABLE = {