Showing 11 changed files with 228 additions and 157 deletions
+1
Changes
... ...
@@ -1,4 +1,5 @@
1 1
 0.1691
2
+    - EXPERIMETAL column method and table_alias think about "-" separator
2 3
     - EXPERIMTANL column method think about separator
3 4
     - removed EXPERIMENTAL col method.
4 5
     - added EXPERIMENTAL separater method
+155 -95
lib/DBIx/Custom.pm
... ...
@@ -79,76 +79,6 @@ sub AUTOLOAD {
79 79
     }
80 80
 }
81 81
 
82
-sub apply_filter { shift->_apply_filter(@_) }
83
-
84
-sub _apply_filter {
85
-    my ($self, $table, @cinfos) = @_;
86
-
87
-    # Initialize filters
88
-    $self->{filter} ||= {};
89
-    $self->{filter}{out} ||= {};
90
-    $self->{filter}{in} ||= {};
91
-    $self->{filter}{end} ||= {};
92
-    
93
-    # Usage
94
-    my $usage = "Usage: \$dbi->apply_filter(" .
95
-                "TABLE, COLUMN1, {in => INFILTER1, out => OUTFILTER1, end => ENDFILTER1}, " .
96
-                "COLUMN2, {in => INFILTER2, out => OUTFILTER2, end => ENDFILTER2}, ...)";
97
-    
98
-    # Apply filter
99
-    for (my $i = 0; $i < @cinfos; $i += 2) {
100
-        
101
-        # Column
102
-        my $column = $cinfos[$i];
103
-        if (ref $column eq 'ARRAY') {
104
-            foreach my $c (@$column) {
105
-                push @cinfos, $c, $cinfos[$i + 1];
106
-            }
107
-            next;
108
-        }
109
-        
110
-        # Filter infomation
111
-        my $finfo = $cinfos[$i + 1] || {};
112
-        croak "$usage (table: $table) " . _subname
113
-          unless  ref $finfo eq 'HASH';
114
-        foreach my $ftype (keys %$finfo) {
115
-            croak "$usage (table: $table) " . _subname
116
-              unless $ftype eq 'in' || $ftype eq 'out' || $ftype eq 'end'; 
117
-        }
118
-        
119
-        # Set filters
120
-        foreach my $way (qw/in out end/) {
121
-        
122
-            # Filter
123
-            my $filter = $finfo->{$way};
124
-            
125
-            # Filter state
126
-            my $state = !exists $finfo->{$way} ? 'not_exists'
127
-                      : !defined $filter        ? 'not_defined'
128
-                      : ref $filter eq 'CODE'   ? 'code'
129
-                      : 'name';
130
-            
131
-            # Filter is not exists
132
-            next if $state eq 'not_exists';
133
-            
134
-            # Check filter name
135
-            croak qq{Filter "$filter" is not registered } . _subname
136
-              if  $state eq 'name'
137
-               && ! exists $self->filters->{$filter};
138
-            
139
-            # Set filter
140
-            my $f = $state eq 'not_defined' ? undef
141
-                  : $state eq 'code'        ? $filter
142
-                  : $self->filters->{$filter};
143
-            $self->{filter}{$way}{$table}{$column} = $f;
144
-            $self->{filter}{$way}{$table}{"$table.$column"} = $f;
145
-            $self->{filter}{$way}{$table}{"${table}__$column"} = $f;
146
-        }
147
-    }
148
-    
149
-    return $self;
150
-}
151
-
152 82
 sub assign_param {
153 83
     my ($self, $param) = @_;
154 84
     
... ...
@@ -375,14 +305,14 @@ sub create_model {
375 305
     my $filter = ref $model->filter eq 'HASH'
376 306
                ? [%{$model->filter}]
377 307
                : $model->filter;
378
-    $self->apply_filter($model->table, @$filter);
308
+    $self->_apply_filter($model->table, @$filter);
379 309
     my $result_filter = ref $model->result_filter eq 'HASH'
380 310
                ? [%{$model->result_filter}]
381 311
                : $model->result_filter;
382 312
     for (my $i = 1; $i < @$result_filter; $i += 2) {
383 313
         $result_filter->[$i] = {in => $result_filter->[$i]};
384 314
     }
385
-    $self->apply_filter($model->table, @$result_filter);
315
+    $self->_apply_filter($model->table, @$result_filter);
386 316
     
387 317
     # Associate table with model
388 318
     croak "Table name is duplicated " . _subname
... ...
@@ -478,6 +408,7 @@ sub execute {
478 408
                 my $filter_name_alias = $filter_name;
479 409
                 $filter_name_alias =~ s/^$alias\./$table\./;
480 410
                 $filter_name_alias =~ s/^${alias}__/${table}__/; 
411
+                $filter_name_alias =~ s/^${alias}-/${table}-/; 
481 412
                 $self->{filter}{$type}{$table}{$filter_name_alias}
482 413
                   = $self->{filter}{$type}{$alias}{$filter_name}
483 414
             }
... ...
@@ -1182,6 +1113,75 @@ sub where {
1182 1113
     );
1183 1114
 }
1184 1115
 
1116
+sub _apply_filter {
1117
+    my ($self, $table, @cinfos) = @_;
1118
+
1119
+    # Initialize filters
1120
+    $self->{filter} ||= {};
1121
+    $self->{filter}{out} ||= {};
1122
+    $self->{filter}{in} ||= {};
1123
+    $self->{filter}{end} ||= {};
1124
+    
1125
+    # Usage
1126
+    my $usage = "Usage: \$dbi->apply_filter(" .
1127
+                "TABLE, COLUMN1, {in => INFILTER1, out => OUTFILTER1, end => ENDFILTER1}, " .
1128
+                "COLUMN2, {in => INFILTER2, out => OUTFILTER2, end => ENDFILTER2}, ...)";
1129
+    
1130
+    # Apply filter
1131
+    for (my $i = 0; $i < @cinfos; $i += 2) {
1132
+        
1133
+        # Column
1134
+        my $column = $cinfos[$i];
1135
+        if (ref $column eq 'ARRAY') {
1136
+            foreach my $c (@$column) {
1137
+                push @cinfos, $c, $cinfos[$i + 1];
1138
+            }
1139
+            next;
1140
+        }
1141
+        
1142
+        # Filter infomation
1143
+        my $finfo = $cinfos[$i + 1] || {};
1144
+        croak "$usage (table: $table) " . _subname
1145
+          unless  ref $finfo eq 'HASH';
1146
+        foreach my $ftype (keys %$finfo) {
1147
+            croak "$usage (table: $table) " . _subname
1148
+              unless $ftype eq 'in' || $ftype eq 'out' || $ftype eq 'end'; 
1149
+        }
1150
+        
1151
+        # Set filters
1152
+        foreach my $way (qw/in out end/) {
1153
+        
1154
+            # Filter
1155
+            my $filter = $finfo->{$way};
1156
+            
1157
+            # Filter state
1158
+            my $state = !exists $finfo->{$way} ? 'not_exists'
1159
+                      : !defined $filter        ? 'not_defined'
1160
+                      : ref $filter eq 'CODE'   ? 'code'
1161
+                      : 'name';
1162
+            
1163
+            # Filter is not exists
1164
+            next if $state eq 'not_exists';
1165
+            
1166
+            # Check filter name
1167
+            croak qq{Filter "$filter" is not registered } . _subname
1168
+              if  $state eq 'name'
1169
+               && ! exists $self->filters->{$filter};
1170
+            
1171
+            # Set filter
1172
+            my $f = $state eq 'not_defined' ? undef
1173
+                  : $state eq 'code'        ? $filter
1174
+                  : $self->filters->{$filter};
1175
+            $self->{filter}{$way}{$table}{$column} = $f;
1176
+            $self->{filter}{$way}{$table}{"$table.$column"} = $f;
1177
+            $self->{filter}{$way}{$table}{"${table}__$column"} = $f;
1178
+            $self->{filter}{$way}{$table}{"${table}-$column"} = $f;
1179
+        }
1180
+    }
1181
+    
1182
+    return $self;
1183
+}
1184
+
1185 1185
 sub _create_bind_values {
1186 1186
     my ($self, $params, $columns, $filter, $type) = @_;
1187 1187
     
... ...
@@ -1424,6 +1424,17 @@ sub _where_to_obj {
1424 1424
     return $obj;
1425 1425
 }
1426 1426
 
1427
+# DEPRECATED!
1428
+sub apply_filter {
1429
+    my $self = shift;
1430
+    
1431
+    warn "apply_filter is DEPRECATED! " . 
1432
+         "use type_rule method, DBIx::Custom::Result filter method, " .
1433
+         "and DBIx::Custom::Model result_filter method instead";
1434
+    
1435
+    return $self->_apply_filter(@_);
1436
+}
1437
+
1427 1438
 # DEPRECATED!
1428 1439
 our %SELECT_AT_ARGS = (%SELECT_ARGS, where => 1, primary_key => 1);
1429 1440
 sub select_at {
... ...
@@ -1544,19 +1555,18 @@ sub register_tag {
1544 1555
 }
1545 1556
 
1546 1557
 # DEPRECATED!
1547
-__PACKAGE__->attr('data_source');
1558
+has 'data_source';
1548 1559
 
1549 1560
 # DEPRECATED!
1550
-__PACKAGE__->attr(
1551
-    dbi_options => sub { {} },
1552
-    filter_check  => 1
1553
-);
1561
+has dbi_options => sub { {} },
1562
+    filter_check  => 1;
1563
+
1554 1564
 
1555 1565
 # DEPRECATED!
1556 1566
 sub default_bind_filter {
1557 1567
     my $self = shift;
1558 1568
     
1559
-    warn "default_bind_filter is DEPRECATED! use apply_filter instead\n";
1569
+    warn "default_bind_filter is DEPRECATED!";
1560 1570
     
1561 1571
     if (@_) {
1562 1572
         my $fname = $_[0];
... ...
@@ -1580,7 +1590,7 @@ sub default_bind_filter {
1580 1590
 sub default_fetch_filter {
1581 1591
     my $self = shift;
1582 1592
 
1583
-    warn "default_fetch_filter is DEPRECATED! use apply_filter instead\n";
1593
+    warn "default_fetch_filter is DEPRECATED!";
1584 1594
     
1585 1595
     if (@_) {
1586 1596
         my $fname = $_[0];
... ...
@@ -1696,6 +1706,7 @@ DBIx::Custom - Useful database access, respecting SQL!
1696 1706
     # Select
1697 1707
     my $result = $dbi->select(
1698 1708
         table  => 'book',
1709
+        column => ['title', 'author'],
1699 1710
         where  => {author => 'Ken'},
1700 1711
     );
1701 1712
 
... ...
@@ -1703,8 +1714,8 @@ DBIx::Custom - Useful database access, respecting SQL!
1703 1714
     my $result = $dbi->select(
1704 1715
         table  => 'book',
1705 1716
         column => [
1706
-            'book.author as book__author',
1707
-            'company.name as company__name'
1717
+            {book => [qw/title author/]},
1718
+            {company => ['name']}
1708 1719
         ],
1709 1720
         where  => {'book.author' => 'Ken'},
1710 1721
         join => ['left outer join company on book.company_id = company.id'],
... ...
@@ -1897,7 +1908,7 @@ and implements the following new ones.
1897 1908
 
1898 1909
 Get available data type.
1899 1910
 
1900
-=head2 C<apply_filter>
1911
+=head2 C<apply_filter> DEPRECATED!
1901 1912
 
1902 1913
     $dbi->apply_filter(
1903 1914
         'book',
... ...
@@ -1924,6 +1935,7 @@ Filter is applied to the follwoing tree column name pattern.
1924 1935
     1. Column        : author
1925 1936
     2. Table.Column  : book.author
1926 1937
     3. Table__Column : book__author
1938
+    4. Table-Column  : book-author
1927 1939
 
1928 1940
 If column name is duplicate with other table,
1929 1941
 Main filter specified by C<table> option is used.
... ...
@@ -1949,24 +1961,29 @@ Create assign parameter.
1949 1961
 
1950 1962
 This is equal to C<update_param> exept that set is not added.
1951 1963
 
1952
-=head2 C<col> EXPERIMETNAL
1964
+=head2 C<column> EXPERIMETNAL
1953 1965
 
1954
-    my $column = $model->col(book => ['author', 'title']);
1966
+    my $column = $dbi->column(book => ['author', 'title']);
1955 1967
 
1956 1968
 Create column clause. The follwoing column clause is created.
1957 1969
 
1958 1970
     book.author as "book.author",
1959 1971
     book.title as "book.title"
1960 1972
 
1961
-=head2 C<column> EXPERIMETNAL
1962
-
1963
-    my $column = $dbi->column(book => ['author', 'title']);
1973
+You can change separator by C<separator> method.
1964 1974
 
1965
-Create column clause. The follwoing column clause is created.
1966
-
1967
-    book.author as book__author,
1968
-    book.title as book__title
1975
+    # Separator is double underbar
1976
+    $dbi->separator('__');
1977
+    
1978
+    book.author as "book__author",
1979
+    book.title as "book__title"
1969 1980
 
1981
+    # Separator is hyphen
1982
+    $dbi->separator('-');
1983
+    
1984
+    book.author as "book-author",
1985
+    book.title as "book-title"
1986
+    
1970 1987
 =head2 C<connect>
1971 1988
 
1972 1989
     my $dbi = DBIx::Custom->connect(
... ...
@@ -2433,14 +2450,57 @@ Register filters, used by C<filter> option of many methods.
2433 2450
 
2434 2451
 Filtering rule when data is send into and get from database.
2435 2452
 This has a little complex problem. 
2453
+
2436 2454
 In C<into> you can specify type name as same as type name defined
2437 2455
 by create table, such as C<DATETIME> or C<DATE>.
2438
-but in C<from> you can't specify type name defined by create table.
2456
+Type rule of C<into> is enabled on the following pattern.
2457
+
2458
+=over 4
2459
+
2460
+=item 1. column name
2461
+
2462
+    issue_date
2463
+    issue_datetime
2464
+
2465
+=item 2. table name and column name, separator is dot
2466
+
2467
+    book.issue_date
2468
+    book.issue_datetime
2469
+
2470
+=back
2471
+
2472
+In C<from> you can't specify type name defined by create table.
2439 2473
 You must specify data type, this is internal one.
2440 2474
 You get all data type by C<available_data_type>.
2441 2475
 
2442 2476
     print $dbi->available_data_type;
2443 2477
 
2478
+Type rule of C<from> is enabled on the following pattern.
2479
+
2480
+=item 1. column name
2481
+
2482
+    issue_date
2483
+    issue_datetime
2484
+
2485
+=item 2. table name and column name, separator is dot
2486
+
2487
+    book.issue_date
2488
+    book.issue_datetime
2489
+
2490
+=item 3. table name and column name, separator is double underbar
2491
+
2492
+    book__issue_date
2493
+    book__issue_datetime
2494
+
2495
+=item 4. table name and column name, separator is hyphen
2496
+
2497
+    book-issue_date
2498
+    book-issue_datetime
2499
+
2500
+This is useful in HTML.
2501
+
2502
+=back
2503
+
2444 2504
 You can also specify multiple types
2445 2505
 
2446 2506
     $dbi->type_rule(
... ...
@@ -2565,7 +2625,7 @@ join clausees needed when SQL is created is used automatically.
2565 2625
 
2566 2626
     $dbi->select(
2567 2627
         table => 'book',
2568
-        column => ['company.location_id as company__location_id'],
2628
+        column => ['company.location_id as location_id'],
2569 2629
         where => {'company.name' => 'Orange'},
2570 2630
         join => [
2571 2631
             'left outer join company on book.company_id = company.id',
... ...
@@ -2576,10 +2636,10 @@ join clausees needed when SQL is created is used automatically.
2576 2636
 In above select, column and where clause contain "company" table,
2577 2637
 the following SQL is created
2578 2638
 
2579
-    select company.location_id as company__location_id
2639
+    select company.location_id as location_id
2580 2640
     from book
2581 2641
       left outer join company on book.company_id = company.id
2582
-    where company.name = Orange
2642
+    where company.name = ?;
2583 2643
 
2584 2644
 =item C<primary_key>
2585 2645
 
+8 -28
lib/DBIx/Custom/Guide.pod
... ...
@@ -574,8 +574,9 @@ Generally Class name is model name, and table name is model name.
574 574
 You can change model name.
575 575
 
576 576
     package MyModel::book;
577
+    use MyModel -base;
577 578
     
578
-    __PACAKGE__->attr(name => 'book_model');
579
+    has name => 'book_model';
579 580
 
580 581
     CLASS        MODEL         TABLE
581 582
     book         book_model    (MODEL) -> book_model
... ...
@@ -587,8 +588,9 @@ Model name is the name used by L<model> of L<DBIx::Custom>.
587 588
 You can change table name.
588 589
 
589 590
     package MyModel::book;
591
+    use MyModel -base;
590 592
     
591
-    __PACAKGE__->attr(table => 'book_table');
593
+    has table => 'book_table';
592 594
 
593 595
     CLASS        MODEL              TABLE
594 596
     book         (CLASS) -> book    book_table
... ...
@@ -602,7 +604,7 @@ Table name is the table really accessed.
602 604
 To create column clause automatically, use C<mycolumn>.
603 605
 Valude of C<table> and C<columns> is used.
604 606
 
605
-    my $column_clause = $model->mycolumn;
607
+    my $mycolumns = $model->mycolumn;
606 608
 
607 609
 If C<table> is 'book'AC<column> is ['id', 'name'],
608 610
 the following clause is created.
... ...
@@ -613,34 +615,12 @@ These column name is for removing column name ambiguities.
613 615
 
614 616
 You can create column clause from columns of other table.
615 617
 
616
-    my $column_clause = $model->column('company');
618
+    my $columns = $model->column('company');
617 619
 
618
-If C<table> is 'company'AC<column> is ['id', 'name'],
620
+If C<table> is "company", C<column> return ['id', 'name'],
619 621
 the following clause is created.
620 622
 
621
-    company.id as company__id, company.name as company__name
622
-
623
-=head2 Create column clause automatically : column_clause
624
-
625
-To create column clause automatically, use C<column_clause>.
626
-Valude of C<table> and C<columns> is used.
627
-
628
-    my $column_clause = $model->column_clause;
629
-
630
-If C<table> is 'book'AC<column> is ['id', 'name'],
631
-the following clause is created.
632
-
633
-    book.id as id, book.name as name
634
-
635
-These column name is for removing column name ambiguities.
636
-
637
-If you remove some columns, use C<remove> option.
638
-
639
-    my $column_clause = $model->column_clause(remove => ['id']);
640
-
641
-If you add some column, use C<add> option.
642
-
643
-    my $column_clause = $model->column_clause(add => ['company.id as company__id']);
623
+    company.id as "company.id", company.name as "company.name"
644 624
 
645 625
 =head2 Model Examples
646 626
 
+1 -13
lib/DBIx/Custom/Model.pm
... ...
@@ -228,24 +228,12 @@ and implements the following new ones.
228 228
     my $column = $model->column(book => ['author', 'title']);
229 229
     my $column = $model->column('book');
230 230
 
231
-Create column clause. The follwoing column clause is created.
232
-
233
-    book.author as book__author,
234
-    book.title as book__title
235
-
236
-If column names is omitted, C<columns> attribute of the model is used.
237
-
238
-=head2 C<col> EXPERIMETNAL
239
-
240
-    my $column = $model->col(book => ['author', 'title']);
241
-    my $column = $model->col('book');
242
-
243 231
 Create column clause. The follwoing column clause is created.
244 232
 
245 233
     book.author as "book.author",
246 234
     book.title as "book.title"
247 235
 
248
-If column names is omitted, C<columns> attribute of the model is used.
236
+If Second argument is ommited, all columns set by C<columns> is used.
249 237
 
250 238
 =head2 C<delete>
251 239
 
+1 -2
lib/DBIx/Custom/Query.pm
... ...
@@ -1,5 +1,4 @@
1 1
 package DBIx::Custom::Query;
2
-
3 2
 use Object::Simple -base;
4 3
 
5 4
 use Carp 'croak';
... ...
@@ -60,7 +59,7 @@ sub filter {
60 59
 }
61 60
 
62 61
 # DEPRECATED!
63
-__PACKAGE__->attr('default_filter');
62
+has 'default_filter';
64 63
 
65 64
 1;
66 65
 
+2 -2
lib/DBIx/Custom/QueryBuilder.pm
... ...
@@ -89,7 +89,7 @@ sub _parse_parameter {
89 89
 }
90 90
 
91 91
 # DEPRECATED!
92
-__PACKAGE__->attr('tags' => sub { {} });
92
+has tags => sub { {} };
93 93
 
94 94
 # DEPRECATED!
95 95
 sub register_tag {
... ...
@@ -335,7 +335,7 @@ sub _parse_tag {
335 335
 }
336 336
 
337 337
 # DEPRECATED!
338
-__PACKAGE__->attr('tag_processors' => sub { {} });
338
+has tag_processors => sub { {} };
339 339
 
340 340
 # DEPRECATED!
341 341
 sub register_tag_processor {
+19 -5
lib/DBIx/Custom/Result.pm
... ...
@@ -116,7 +116,7 @@ sub fetch {
116 116
         my $column = $columns->[$i];
117 117
         my $f  = exists $filter->{$column}
118 118
                ? $filter->{$column}
119
-               : $self->default_filter;
119
+               : $self->_default_filter;
120 120
         my $ef = $end_filter->{$column};
121 121
         
122 122
         # Filtering
... ...
@@ -186,7 +186,7 @@ sub fetch_hash {
186 186
         my $column = $columns->[$i];
187 187
         my $f  = exists $filter->{$column}
188 188
                ? $filter->{$column}
189
-               : $self->default_filter;
189
+               : $self->_default_filter;
190 190
         my $ef = $end_filter->{$column};
191 191
         
192 192
         # Filtering
... ...
@@ -266,25 +266,39 @@ sub fetch_multi {
266 266
 
267 267
 *one = \&fetch_hash_first;
268 268
 
269
+# DEPRECATED!
269 270
 sub remove_end_filter {
270 271
     my $self = shift;
271 272
     
273
+    warn "remove_end_filter is DEPRECATED! use filter_off attribute instead";
274
+    
272 275
     $self->{end_filter} = {};
273 276
     
274 277
     return $self;
275 278
 }
276 279
 
280
+# DEPRECATED!
277 281
 sub remove_filter {
278 282
     my $self = shift;
283
+
284
+    warn "remove_filter is DEPRECATED! use filter_off attribute instead";
279 285
     
280 286
     $self->{filter} = {};
281 287
     
282 288
     return $self;
283 289
 }
284 290
 
285
-# Deprecated
291
+# DEPRECATED!
286 292
 sub default_filter {
287 293
     my $self = shift;
294
+    warn "default_filter is DEPRECATED!";
295
+    return $self->_default_filter(@_)
296
+}
297
+
298
+# DEPRECATED!
299
+sub _default_filter {
300
+    my $self = shift;
301
+
288 302
     
289 303
     if (@_) {
290 304
         my $fname = $_[0];
... ...
@@ -305,7 +319,7 @@ sub default_filter {
305 319
 }
306 320
 
307 321
 # DEPRECATED!
308
-__PACKAGE__->attr('filter_check'); 
322
+has 'filter_check'; 
309 323
 
310 324
 1;
311 325
 
... ...
@@ -489,7 +503,7 @@ L<DBIx::Custom>.
489 503
 
490 504
 This is alias for C<fetch_hash_first>.
491 505
 
492
-=head2 C<remove_end_filter>
506
+=head2 C<remove_end_filter> DEPRECATED!
493 507
 
494 508
     $result->remove_end_filter;
495 509
 
+34 -1
t/dbix-custom-core-sqlite.t
... ...
@@ -6,7 +6,7 @@ use utf8;
6 6
 use Encode qw/encode_utf8 decode_utf8/;
7 7
 use Data::Dumper;
8 8
 
9
-$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/};
9
+#$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/};
10 10
 
11 11
 BEGIN {
12 12
     eval { require DBD::SQLite; 1 }
... ...
@@ -2187,6 +2187,26 @@ $result = $model->select(
2187 2187
 is_deeply($result->one, 
2188 2188
           {'table2_alias.key1' => 1, 'table2_alias.key3' => 48});
2189 2189
 
2190
+$dbi->separator('__');
2191
+$result = $model->select(
2192
+    column => [
2193
+        $model->column('table2_alias')
2194
+    ],
2195
+    where => {'table2_alias.key3' => 2}
2196
+);
2197
+is_deeply($result->one, 
2198
+          {'table2_alias__key1' => 1, 'table2_alias__key3' => 48});
2199
+
2200
+$dbi->separator('-');
2201
+$result = $model->select(
2202
+    column => [
2203
+        $model->column('table2_alias')
2204
+    ],
2205
+    where => {'table2_alias.key3' => 2}
2206
+);
2207
+is_deeply($result->one, 
2208
+          {'table2_alias-key1' => 1, 'table2_alias-key3' => 48});
2209
+
2190 2210
 test 'type() option';
2191 2211
 $dbi = DBIx::Custom->connect(
2192 2212
     data_source => 'dbi:SQLite:dbname=:memory:',
... ...
@@ -2768,6 +2788,19 @@ is_deeply($result->one,
2768 2788
           {key1 => 2, key2 => 2, 'table2__key1' => 3, 'table2__key3' => 9});
2769 2789
 is_deeply($model2->select->one, {key1 => 3, key3 => 9});
2770 2790
 
2791
+$dbi->separator('-');
2792
+$model = $dbi->model('table1');
2793
+$result = $model->select(
2794
+    column => [
2795
+        $model->mycolumn,
2796
+        {table2 => [qw/key1 key3/]}
2797
+    ],
2798
+    where => {'table1.key1' => 1}
2799
+);
2800
+is_deeply($result->one,
2801
+          {key1 => 2, key2 => 2, 'table2-key1' => 3, 'table2-key3' => 9});
2802
+is_deeply($model2->select->one, {key1 => 3, key3 => 9});
2803
+
2771 2804
 
2772 2805
 test 'filter_off';
2773 2806
 $dbi = DBIx::Custom->connect($NEW_ARGS->{0});
+1 -2
t/dbix-custom-core-sqlite/MyModel8.pm
... ...
@@ -1,5 +1,4 @@
1 1
 package MyModel8;
2
-
3
-use base 'DBIx::Custom::Model';
2
+use DBIx::Custom::Model -base;
4 3
 
5 4
 1;
+3 -5
t/dbix-custom-core-sqlite/MyModel8/table1.pm
... ...
@@ -1,10 +1,8 @@
1 1
 package MyModel8::table1;
2
+use MyModel8 -base;
2 3
 
3
-use base 'MyModel8';
4
-
5
-__PACKAGE__->attr(join => sub { ['left join table2 as table2_alias on table1.key1 = table2_alias.key1'] });
6
-
7
-__PACKAGE__->attr(table_alias => sub { {'table2_alias' => 'table2'} });
4
+has join => sub { ['left join table2 as table2_alias on table1.key1 = table2_alias.key1'] };
5
+has table_alias => sub { {'table2_alias' => 'table2'} };
8 6
 
9 7
 
10 8
 1;
+3 -4
t/dbix-custom-core-sqlite/MyModel8/table2.pm
... ...
@@ -1,11 +1,10 @@
1 1
 package MyModel8::table2;
2
+use MyModel8 -base;
2 3
 
3
-use base 'MyModel8';
4
-
5
-__PACKAGE__->attr(filter => sub {
4
+has filter => sub {
6 5
     {
7 6
         key3 => {out => sub { $_[0] * 2}, in => sub { $_[0] * 3}, end => sub { $_[0] * 4 }}
8 7
     }
9
-});
8
+};
10 9
 
11 10
 1;