| ... | ... | 
                  @@ -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  | 
              
| ... | ... | 
                  @@ -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 | 
                  }  | 
              
| ... | ... | 
                  @@ -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 {
                 | 
              
| ... | ... | 
                  @@ -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');
                 | 
              
| ... | ... | 
                  @@ -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;  | 
              
| ... | ... | 
                  @@ -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;  | 
              
| ... | ... | 
                  @@ -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;  | 
              
| ... | ... | 
                  @@ -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 = {
                 |