... | ... |
@@ -11,7 +11,7 @@ my $builder = Module::Build->new( |
11 | 11 |
'Test::More' => 0, |
12 | 12 |
}, |
13 | 13 |
requires => { |
14 |
- 'Object::Simple' => 2.0702, |
|
14 |
+ 'Object::Simple' => 2.1301, |
|
15 | 15 |
'DBI' => 1.605, |
16 | 16 |
'DBD::SQLite' => 1.25, |
17 | 17 |
'Time::Piece' => 1.15 |
... | ... |
@@ -1,3 +1,7 @@ |
1 |
+0.0903 |
|
2 |
+ catch up with Object::Simple update |
|
3 |
+0.0902 |
|
4 |
+ cleanup |
|
1 | 5 |
0.0901 |
2 | 6 |
DBIx::Basic filter 'encode_utf8' utf8::upgrade process is deleted |
3 | 7 |
0.0801 |
... | ... |
@@ -6,59 +6,48 @@ use warnings; |
6 | 6 |
|
7 | 7 |
use 5.008001; |
8 | 8 |
|
9 |
- |
|
10 |
-our $VERSION = '0.0901'; |
|
11 |
- |
|
12 | 9 |
use Carp 'croak'; |
13 | 10 |
use DBI; |
14 | 11 |
use DBIx::Custom::Result; |
15 | 12 |
use DBIx::Custom::SQL::Template; |
16 | 13 |
|
17 |
-my $p = __PACKAGE__; |
|
18 |
- |
|
19 |
-$p->attr('dbh'); |
|
20 |
- |
|
21 |
-$p->class_attr(_query_caches => (type => 'hash', default => sub { {} })) |
|
22 |
- ->class_attr(_query_cache_keys => (type => 'array', default => sub { [] })) |
|
23 |
- ->class_attr(query_cache_max => 50); |
|
24 |
- |
|
25 |
-$p->hybrid_attr([qw/user password data_source |
|
26 |
- database host port |
|
27 |
- bind_filter fetch_filter/] => (clone => 'scalar')); |
|
14 |
+__PACKAGE__->attr('dbh'); |
|
28 | 15 |
|
29 |
-$p->hybrid_attr([qw/no_bind_filters no_fetch_filters/] |
|
30 |
- => (type => 'array', default => sub { [] }, clone => 'array')); |
|
16 |
+__PACKAGE__->class_attr(_query_caches => sub { {} }); |
|
17 |
+__PACKAGE__->class_attr(_query_cache_keys => sub { [] }); |
|
18 |
+__PACKAGE__->class_attr('query_cache_max', default => 50, clone => 'scalar'); |
|
31 | 19 |
|
32 |
-$p->hybrid_attr(options => (type => 'hash', default => sub { {} }, |
|
33 |
- clone => 'hash')); |
|
20 |
+__PACKAGE__->dual_attr([qw/user password data_source/], clone => 'scalar'); |
|
21 |
+__PACKAGE__->dual_attr([qw/database host port/], clone => 'scalar'); |
|
22 |
+__PACKAGE__->dual_attr([qw/bind_filter fetch_filter/], clone => 'scalar'); |
|
34 | 23 |
|
35 |
-$p->hybrid_attr([qw/filters formats/] |
|
36 |
- => (type => 'hash', default => sub { {} }, |
|
37 |
- deref => 1, clone => 'hash')); |
|
24 |
+__PACKAGE__->dual_attr([qw/no_bind_filters no_fetch_filters/], |
|
25 |
+ default => sub { [] }, clone => 'array'); |
|
38 | 26 |
|
39 |
-$p->hybrid_attr(result_class => (default => 'DBIx::Custom::Result', |
|
40 |
- clone => 'scalar')); |
|
27 |
+__PACKAGE__->dual_attr([qw/options filters formats/], |
|
28 |
+ default => sub { {} }, clone => 'hash'); |
|
41 | 29 |
|
42 |
-$p->hybrid_attr(sql_tmpl => (default => sub {DBIx::Custom::SQL::Template->new}, |
|
43 |
- clone => sub {$_[0] ? $_[0]->clone : undef})); |
|
30 |
+__PACKAGE__->dual_attr('result_class', default => 'DBIx::Custom::Result', |
|
31 |
+ clone => 'scalar'); |
|
44 | 32 |
|
45 |
-### Methods |
|
33 |
+__PACKAGE__->dual_attr('sql_tmpl', default => sub {DBIx::Custom::SQL::Template->new}, |
|
34 |
+ clone => sub {$_[0] ? $_[0]->clone : undef}); |
|
46 | 35 |
|
47 | 36 |
sub add_filter { |
48 | 37 |
my $invocant = shift; |
49 | 38 |
|
50 |
- my %old_filters = $invocant->filters; |
|
51 |
- my %new_filters = ref $_[0] eq 'HASH' ? %{$_[0]} : @_; |
|
52 |
- $invocant->filters(%old_filters, %new_filters); |
|
39 |
+ my $filters = ref $_[0] eq 'HASH' ? $_[0] : {@_}; |
|
40 |
+ $invocant->filters({%{$invocant->filters}, %$filters}); |
|
41 |
+ |
|
53 | 42 |
return $invocant; |
54 | 43 |
} |
55 | 44 |
|
56 | 45 |
sub add_format{ |
57 | 46 |
my $invocant = shift; |
58 | 47 |
|
59 |
- my %old_formats = $invocant->formats; |
|
60 |
- my %new_formats = ref $_[0] eq 'HASH' ? %{$_[0]} : @_; |
|
61 |
- $invocant->formats(%old_formats, %new_formats); |
|
48 |
+ my $formats = ref $_[0] eq 'HASH' ? $_[0] : {@_}; |
|
49 |
+ $invocant->formats({%{$invocant->formats}, %$formats}); |
|
50 |
+ |
|
62 | 51 |
return $invocant; |
63 | 52 |
} |
64 | 53 |
|
... | ... |
@@ -737,7 +726,11 @@ DBIx::Custom - Customizable DBI |
737 | 726 |
|
738 | 727 |
=head1 VERSION |
739 | 728 |
|
740 |
-Version 0.0801 |
|
729 |
+Version 0.0903 |
|
730 |
+ |
|
731 |
+=cut |
|
732 |
+ |
|
733 |
+our $VERSION = '0.0903'; |
|
741 | 734 |
|
742 | 735 |
=head1 SYNOPSYS |
743 | 736 |
|
... | ... |
@@ -5,14 +5,12 @@ use warnings; |
5 | 5 |
use strict; |
6 | 6 |
use Encode qw/decode encode/; |
7 | 7 |
|
8 |
-my $class = __PACKAGE__; |
|
9 |
- |
|
10 |
-$class->add_filter( |
|
8 |
+__PACKAGE__->add_filter( |
|
11 | 9 |
encode_utf8 => sub { encode('UTF-8', shift) }, |
12 | 10 |
decode_utf8 => sub { decode('UTF-8', shift) } |
13 | 11 |
); |
14 | 12 |
|
15 |
-$class->add_format( |
|
13 |
+__PACKAGE__->add_format( |
|
16 | 14 |
'SQL99_date' => '%Y-%m-%d', |
17 | 15 |
'SQL99_datetime' => '%Y-%m-%d %H:%M:%S', |
18 | 16 |
'SQL99_time' => '%H:%M:%S', |
... | ... |
@@ -5,12 +5,10 @@ use warnings; |
5 | 5 |
use strict; |
6 | 6 |
use Carp 'croak'; |
7 | 7 |
|
8 |
-my $p = __PACKAGE__; |
|
9 |
- |
|
10 |
-$p->add_format( |
|
11 |
- datetime => $p->formats->{SQL99_datetime}, |
|
12 |
- date => $p->formats->{SQL99_date}, |
|
13 |
- time => $p->formats->{SQL99_time}, |
|
8 |
+__PACKAGE__->add_format( |
|
9 |
+ datetime => __PACKAGE__->formats->{SQL99_datetime}, |
|
10 |
+ date => __PACKAGE__->formats->{SQL99_date}, |
|
11 |
+ time => __PACKAGE__->formats->{SQL99_time}, |
|
14 | 12 |
); |
15 | 13 |
|
16 | 14 |
|
... | ... |
@@ -4,18 +4,16 @@ use base 'Object::Simple::Base'; |
4 | 4 |
use strict; |
5 | 5 |
use warnings; |
6 | 6 |
|
7 |
-my $p = __PACKAGE__; |
|
7 |
+__PACKAGE__->attr([qw/sql key_infos bind_filter fetch_filter sth/]); |
|
8 |
+__PACKAGE__->attr(_no_bind_filters_map => sub { {} }); |
|
9 |
+__PACKAGE__->attr(no_fetch_filters => sub { [] }); |
|
8 | 10 |
|
9 |
-$p->attr([qw/sql key_infos bind_filter fetch_filter sth/]) |
|
10 |
- ->attr(_no_bind_filters_map => sub { {} }) |
|
11 |
- ->attr(no_fetch_filters => (type => 'array', default => sub { [] })); |
|
12 |
- |
|
13 |
-$p->attr(no_bind_filters => (type => 'array', trigger => sub { |
|
11 |
+__PACKAGE__->attr('no_bind_filters', trigger => sub { |
|
14 | 12 |
my $self = shift; |
15 | 13 |
my $no_bind_filters = $self->no_bind_filters || []; |
16 | 14 |
my %no_bind_filters_map = map {$_ => 1} @{$no_bind_filters}; |
17 | 15 |
$self->_no_bind_filters_map(\%no_bind_filters_map); |
18 |
-})); |
|
16 |
+}); |
|
19 | 17 |
|
20 | 18 |
sub new { |
21 | 19 |
my $self = shift->SUPER::new(@_); |
... | ... |
@@ -7,17 +7,15 @@ use Carp 'croak'; |
7 | 7 |
|
8 | 8 |
use Object::Simple::Util; |
9 | 9 |
|
10 |
-my $p = __PACKAGE__; |
|
10 |
+__PACKAGE__->attr([qw/_dbi sth fetch_filter/]); |
|
11 |
+__PACKAGE__->attr(_no_fetch_filters_map => sub { {} }); |
|
11 | 12 |
|
12 |
-$p->attr([qw/_dbi sth fetch_filter/]) |
|
13 |
- ->attr(_no_fetch_filters_map => sub { {} }); |
|
14 |
- |
|
15 |
-$p->attr(no_fetch_filters => (type => 'array', trigger => sub { |
|
13 |
+__PACKAGE__->attr('no_fetch_filters', trigger => sub { |
|
16 | 14 |
my $self = shift; |
17 | 15 |
my $no_fetch_filters = $self->no_fetch_filters || []; |
18 | 16 |
my %no_fetch_filters_map = map {$_ => 1} @{$no_fetch_filters}; |
19 | 17 |
$self->_no_fetch_filters_map(\%no_fetch_filters_map); |
20 |
-})); |
|
18 |
+}); |
|
21 | 19 |
|
22 | 20 |
sub new { |
23 | 21 |
my $self = shift->SUPER::new(@_); |
... | ... |
@@ -7,17 +7,15 @@ use Carp 'croak'; |
7 | 7 |
|
8 | 8 |
use DBIx::Custom::Query; |
9 | 9 |
|
10 |
-my $p = __PACKAGE__; |
|
10 |
+__PACKAGE__->dual_attr('tag_processors', default => sub { {} }, |
|
11 |
+ clone => 'hash'); |
|
11 | 12 |
|
12 |
-$p->hybrid_attr(tag_processors => (type => 'hash', default => sub { {} }, |
|
13 |
- deref => 1, clone => 'hash')); |
|
13 |
+__PACKAGE__->dual_attr('tag_start', default => '{', clone => 'scalar'); |
|
14 |
+__PACKAGE__->dual_attr('tag_end', default => '}', clone => 'scalar'); |
|
14 | 15 |
|
15 |
-$p->hybrid_attr(tag_start => (default => '{', clone => 'scalar')) |
|
16 |
- ->hybrid_attr(tag_end => (default => '}', clone => 'scalar')); |
|
16 |
+__PACKAGE__->dual_attr('tag_syntax', clone => 'scalar'); |
|
17 | 17 |
|
18 |
-$p->hybrid_attr(tag_syntax => (clone => 'scalar')); |
|
19 |
- |
|
20 |
-$p->add_tag_processor( |
|
18 |
+__PACKAGE__->add_tag_processor( |
|
21 | 19 |
'?' => \&DBIx::Custom::SQL::Template::TagProcessors::expand_basic_tag, |
22 | 20 |
'=' => \&DBIx::Custom::SQL::Template::TagProcessors::expand_basic_tag, |
23 | 21 |
'<>' => \&DBIx::Custom::SQL::Template::TagProcessors::expand_basic_tag, |
... | ... |
@@ -31,7 +29,7 @@ $p->add_tag_processor( |
31 | 29 |
'update' => \&DBIx::Custom::SQL::Template::TagProcessors::expand_update_tag |
32 | 30 |
); |
33 | 31 |
|
34 |
-$p->tag_syntax(<< 'EOS'); |
|
32 |
+__PACKAGE__->tag_syntax(<< 'EOS'); |
|
35 | 33 |
[tag] [expand] |
36 | 34 |
{? name} ? |
37 | 35 |
{= name} name = ? |
... | ... |
@@ -54,7 +52,7 @@ EOS |
54 | 52 |
sub add_tag_processor { |
55 | 53 |
my $invocant = shift; |
56 | 54 |
my $tag_processors = ref $_[0] eq 'HASH' ? $_[0] : {@_}; |
57 |
- $invocant->tag_processors(%{$invocant->tag_processors}, %{$tag_processors}); |
|
55 |
+ $invocant->tag_processors({%{$invocant->tag_processors}, %{$tag_processors}}); |
|
58 | 56 |
return $invocant; |
59 | 57 |
} |
60 | 58 |
|
... | ... |
@@ -5,12 +5,10 @@ use strict; |
5 | 5 |
use warnings; |
6 | 6 |
use Carp 'croak'; |
7 | 7 |
|
8 |
-my $p = __PACKAGE__; |
|
9 |
- |
|
10 |
-$p->add_format( |
|
11 |
- datetime => $p->formats->{SQL99_datetime}, |
|
12 |
- date => $p->formats->{SQL99_date}, |
|
13 |
- time => $p->formats->{SQL99_time}, |
|
8 |
+__PACKAGE__->add_format( |
|
9 |
+ datetime => __PACKAGE__->formats->{SQL99_datetime}, |
|
10 |
+ date => __PACKAGE__->formats->{SQL99_date}, |
|
11 |
+ time => __PACKAGE__->formats->{SQL99_time}, |
|
14 | 12 |
); |
15 | 13 |
|
16 | 14 |
sub connect { |
... | ... |
@@ -227,8 +227,8 @@ $rows = $result->fetch_hash_all; |
227 | 227 |
is_deeply($rows, [{key1 => 2, key2 => 6}], "$test : bind_filter fetch_filter"); |
228 | 228 |
|
229 | 229 |
$dbi->do("delete from table1;"); |
230 |
-$insert_query->no_bind_filters('key1'); |
|
231 |
-$select_query->no_fetch_filters('key2'); |
|
230 |
+$insert_query->no_bind_filters(['key1']); |
|
231 |
+$select_query->no_fetch_filters(['key2']); |
|
232 | 232 |
$dbi->query($insert_query, {key1 => 1, key2 => 2}); |
233 | 233 |
$result = $dbi->query($select_query); |
234 | 234 |
$rows = $result->fetch_hash_all; |
... | ... |
@@ -53,12 +53,8 @@ test 'Sub class constructor'; |
53 | 53 |
->password('b') |
54 | 54 |
->data_source('c') |
55 | 55 |
->options({d => 1, e => 2}) |
56 |
- ->filters( |
|
57 |
- f => 3 |
|
58 |
- ) |
|
59 |
- ->formats( |
|
60 |
- f => 3 |
|
61 |
- ) |
|
56 |
+ ->filters({f => 3}) |
|
57 |
+ ->formats({f => 3}) |
|
62 | 58 |
->bind_filter('f') |
63 | 59 |
->fetch_filter('g') |
64 | 60 |
->result_class('DBIx::Custom::Result') |
... | ... |
@@ -102,8 +98,8 @@ is($dbi->database, 'a', "$test : database"); |
102 | 98 |
is($dbi->password, 'b', "$test : password"); |
103 | 99 |
is($dbi->data_source, 'c', "$test : data_source"); |
104 | 100 |
is_deeply($dbi->options, {d => 1, e => 2}, "$test : options"); |
105 |
-is_deeply({$dbi->filters}, {f => 3}, "$test : filters"); |
|
106 |
-is_deeply({$dbi->formats}, {f => 3}, "$test : formats"); |
|
101 |
+is_deeply($dbi->filters, {f => 3}, "$test : filters"); |
|
102 |
+is_deeply($dbi->formats, {f => 3}, "$test : formats"); |
|
107 | 103 |
is($dbi->bind_filter, 'f', "$test : bind_filter"); |
108 | 104 |
is($dbi->fetch_filter, 'g', "$test : fetch_filter"); |
109 | 105 |
is($dbi->result_class, 'DBIx::Custom::Result', "$test : result_class"); |
... | ... |
@@ -142,12 +138,8 @@ test 'Customized sub class constructor default'; |
142 | 138 |
->password('bo') |
143 | 139 |
->data_source('co') |
144 | 140 |
->options({do => 10, eo => 20}) |
145 |
- ->filters( |
|
146 |
- fo => 30 |
|
147 |
- ) |
|
148 |
- ->formats( |
|
149 |
- fo => 30 |
|
150 |
- ) |
|
141 |
+ ->filters({fo => 30}) |
|
142 |
+ ->formats({fo => 30}) |
|
151 | 143 |
->bind_filter('fo') |
152 | 144 |
->fetch_filter('go') |
153 | 145 |
->result_class('ho') |
... | ... |
@@ -192,8 +184,8 @@ is($dbi->database, 'a', "$test : database"); |
192 | 184 |
is($dbi->password, 'b', "$test : password"); |
193 | 185 |
is($dbi->data_source, 'c', "$test : data_source"); |
194 | 186 |
is_deeply($dbi->options, {d => 1, e => 2}, "$test : options"); |
195 |
-is_deeply({$dbi->filters}, {f => 3}, "$test : filters"); |
|
196 |
-is_deeply({$dbi->formats}, {f => 3}, "$test : formats"); |
|
187 |
+is_deeply($dbi->filters, {f => 3}, "$test : filters"); |
|
188 |
+is_deeply($dbi->formats, {f => 3}, "$test : formats"); |
|
197 | 189 |
is($dbi->bind_filter, 'f', "$test : bind_filter"); |
198 | 190 |
is($dbi->fetch_filter, 'g', "$test : fetch_filter"); |
199 | 191 |
is($dbi->result_class, 'h', "$test : result_class"); |
... | ... |
@@ -219,14 +211,13 @@ $dbi->filter_off; |
219 | 211 |
ok(!$dbi->bind_filter, "$test : bind_filter off"); |
220 | 212 |
ok(!$dbi->fetch_filter, "$test : fetch_filter off"); |
221 | 213 |
|
222 |
-__END__ |
|
223 | 214 |
test 'Accessor'; |
224 | 215 |
$dbi = DBIx::Custom->new; |
225 |
-$dbi->options(opt1 => 1, opt2 => 2); |
|
216 |
+$dbi->options({opt1 => 1, opt2 => 2}); |
|
226 | 217 |
is_deeply(scalar $dbi->options, {opt1 => 1, opt2 => 2}, "$test : options"); |
227 | 218 |
|
228 |
-$dbi->no_bind_filters('a', 'b'); |
|
219 |
+$dbi->no_bind_filters(['a', 'b']); |
|
229 | 220 |
is_deeply(scalar $dbi->no_bind_filters, ['a', 'b'], "$test: no_bind_filters"); |
230 | 221 |
|
231 |
-$dbi->no_fetch_filters('a', 'b'); |
|
222 |
+$dbi->no_fetch_filters(['a', 'b']); |
|
232 | 223 |
is_deeply(scalar $dbi->no_fetch_filters, ['a', 'b'], "$test: no_fetch_filters"); |