Merge the last bits of indirect callchain optimization
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / CDBICompat / Constructor.pm
index 2b4b1e9..78c6d33 100644 (file)
@@ -1,17 +1,32 @@
-package DBIx::Class::CDBICompat::Constructor;
+package # hide from PAUSE
+    DBIx::Class::CDBICompat::Constructor;
 
 use strict;
 use warnings;
 
+use base 'DBIx::Class::CDBICompat::ImaDBI';
+
+use Carp;
+use DBIx::Class::_Util qw(quote_sub perlstring);
+use namespace::clean;
+
+__PACKAGE__->set_sql(Retrieve => <<'');
+SELECT __ESSENTIAL__
+FROM   __TABLE__
+WHERE  %s
+
 sub add_constructor {
-  my ($class, $meth, $sql) = @_;
-  $class = ref $class if ref $class;
-  no strict 'refs';
-  *{"${class}::${meth}"} =
-    sub {
-      my ($class, @args) = @_;
-      return $class->retrieve_from_sql($sql, @args);
-    };
+    my ($class, $method, $fragment) = @_;
+
+    croak("constructors needs a name") unless $method;
+
+    carp("$method already exists in $class") && return
+       if $class->can($method);
+
+    quote_sub "${class}::${method}" => sprintf( <<'EOC', perlstring $fragment );
+      my $self = shift;
+      $self->sth_to_objects($self->sql_Retrieve(%s), \@_);
+EOC
 }
 
 1;