Showing 2 changed files with 70 additions and 0 deletions
+47
lib/DBIx/Custom.pm
... ...
@@ -59,6 +59,33 @@ __PACKAGE__->register_filter(
59 59
     decode_utf8 => sub { decode_utf8($_[0]) }
60 60
 );
61 61
 
62
+our $AUTOLOAD;
63
+
64
+sub AUTOLOAD {
65
+    my $self = shift;
66
+
67
+    # Method
68
+    my ($package, $method) = $AUTOLOAD =~ /^([\w\:]+)\:\:(\w+)$/;
69
+
70
+    # Helper
71
+    $self->{_helpers} ||= {};
72
+    croak qq/Can't locate object method "$method" via "$package"/
73
+      unless my $helper = $self->{_helpers}->{$method};
74
+
75
+    # Run
76
+    return $self->$helper(@_);
77
+}
78
+
79
+sub helper {
80
+    my $self = shift;
81
+    
82
+    # Merge
83
+    my $helpers = ref $_[0] eq 'HASH' ? $_[0] : {@_};
84
+    $self->{_helpers} = {%{$self->{_helpers} || {}}, %$helpers};
85
+    
86
+    return $self;
87
+}
88
+
62 89
 sub connect {
63 90
     my $proto = shift;
64 91
     
... ...
@@ -183,6 +210,8 @@ sub delete {
183 210
 
184 211
 sub delete_all { shift->delete(allow_delete_all => 1, @_) }
185 212
 
213
+sub DESTROY { }
214
+
186 215
 our %VALID_EXECUTE_ARGS = map { $_ => 1 } qw/param filter/;
187 216
 
188 217
 sub execute{
... ...
@@ -1331,6 +1360,24 @@ B<Example:>
1331 1360
     
1332 1361
     $dbi->delete_all(table => 'books');
1333 1362
 
1363
+=head2 C<(experimental) helper>
1364
+
1365
+    $dbi->helper(
1366
+        update_or_insert => sub {
1367
+            my $self = shift;
1368
+            # do something
1369
+        },
1370
+        find_or_create   => sub {
1371
+            my $self = shift;
1372
+            # do something
1373
+        }
1374
+    );
1375
+
1376
+Register helper methods. These method is called from L<DBIx::Custom> object directory.
1377
+
1378
+    $dbi->update_or_insert;
1379
+    $dbi->find_or_create;
1380
+
1334 1381
 =head2 C<insert>
1335 1382
 
1336 1383
     $dbi->insert(table  => $table, 
+23
t/dbix-custom-core-sqlite.t
... ...
@@ -608,3 +608,26 @@ eval{ $dbi->begin_work };
608 608
 ok($@, "$test : exception");
609 609
 $dbi->dbh->{AutoCommit} = 1;
610 610
 
611
+
612
+test 'helper';
613
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
614
+$dbi->helper(
615
+    one => sub { 1 }
616
+);
617
+$dbi->helper(
618
+    two => sub { 2 }
619
+);
620
+$dbi->helper({
621
+    twice => sub {
622
+        my $self = shift;
623
+        return $_[0] * 2;
624
+    }
625
+});
626
+
627
+is($dbi->one, 1, "$test : first");
628
+is($dbi->two, 2, "$test : second");
629
+is($dbi->twice(5), 10 , "$test : second");
630
+
631
+eval {$dbi->XXXXXX};
632
+like($@, qr/\QCan't locate object method "XXXXXX" via "DBIx::Custom"/, "$test : not exists");
633
+