add self to credits
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader.pm
index 2e2742e..a68e585 100644 (file)
@@ -7,16 +7,16 @@ use MRO::Compat;
 use mro 'c3';
 use Carp::Clan qw/^DBIx::Class/;
 use Scalar::Util 'weaken';
-use Sub::Name 'subname';
-use DBIx::Class::Schema::Loader::Utils 'array_eq';
+use Sub::Util 'set_subname';
+use DBIx::Class::Schema::Loader::Utils qw/array_eq sigwarn_silencer/;
 use Try::Tiny;
-use Hash::Merge 'merge';
+use curry;
 use namespace::clean;
 
 # Always remember to do all digits for the version even if they're 0
 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
 # brain damage and presumably various other packaging systems too
-our $VERSION = '0.07037';
+our $VERSION = '0.07049';
 
 __PACKAGE__->mk_group_accessors('inherited', qw/
                                 _loader_args
@@ -37,49 +37,49 @@ DBIx::Class::Schema::Loader - Create a DBIx::Class::Schema based on a database
 
 =head1 SYNOPSIS
 
-  ### use this module to generate a set of class files
-
-  # in a script
-  use DBIx::Class::Schema::Loader qw/ make_schema_at /;
-  make_schema_at(
-      'My::Schema',
-      { debug => 1,
-        dump_directory => './lib',
-      },
-      [ 'dbi:Pg:dbname="foo"', 'myuser', 'mypassword',
-         { loader_class => 'MyLoader' } # optionally
-      ],
-  );
+    ### use this module to generate a set of class files
 
-  # from the command line or a shell script with dbicdump (distributed
-  # with this module).  Do `perldoc dbicdump` for usage.
-  dbicdump -o dump_directory=./lib \
-           -o components='["InflateColumn::DateTime"]' \
-           -o debug=1 \
-           My::Schema \
-           'dbi:Pg:dbname=foo' \
-           myuser \
-           mypassword
-
-  ### or generate and load classes at runtime
-  # note: this technique is not recommended
-  # for use in production code
-
-  package My::Schema;
-  use base qw/DBIx::Class::Schema::Loader/;
-
-  __PACKAGE__->loader_options(
-      constraint              => '^foo.*',
-      # debug                 => 1,
-  );
+    # in a script
+    use DBIx::Class::Schema::Loader qw/ make_schema_at /;
+    make_schema_at(
+        'My::Schema',
+        { debug => 1,
+          dump_directory => './lib',
+        },
+        [ 'dbi:Pg:dbname="foo"', 'myuser', 'mypassword',
+           { loader_class => 'MyLoader' } # optionally
+        ],
+    );
+
+    # from the command line or a shell script with dbicdump (distributed
+    # with this module).  Do `perldoc dbicdump` for usage.
+    dbicdump -o dump_directory=./lib \
+             -o components='["InflateColumn::DateTime"]' \
+             -o debug=1 \
+             My::Schema \
+             'dbi:Pg:dbname=foo' \
+             myuser \
+             mypassword
+
+    ### or generate and load classes at runtime
+    # note: this technique is not recommended
+    # for use in production code
+
+    package My::Schema;
+    use base qw/DBIx::Class::Schema::Loader/;
+
+    __PACKAGE__->loader_options(
+        constraint              => '^foo.*',
+        # debug                 => 1,
+    );
 
-  #### in application code elsewhere:
+    #### in application code elsewhere:
 
-  use My::Schema;
+    use My::Schema;
 
-  my $schema1 = My::Schema->connect( $dsn, $user, $password, $attrs);
-  # -or-
-  my $schema1 = "My::Schema"; $schema1->connection(as above);
+    my $schema1 = My::Schema->connect( $dsn, $user, $password, $attrs);
+    # -or-
+    my $schema1 = "My::Schema"; $schema1->connection(as above);
 
 =head1 DESCRIPTION
 
@@ -187,13 +187,13 @@ sub _invoke_loader {
     $args->{naming} = $self->naming if $self->naming;
     $args->{use_namespaces} = $self->use_namespaces if defined $self->use_namespaces;
 
-    # XXX this only works for relative storage_type, like ::DBI ...
     my $loader_class = $self->loader_class;
     if ($loader_class) {
         $loader_class = "DBIx::Class::Schema::Loader${loader_class}" if $loader_class =~ /^::/;
         $args->{loader_class} = $loader_class;
     };
 
+    # XXX this only works for relative storage_type, like ::DBI ...
     my $impl = $loader_class || "DBIx::Class::Schema::Loader" . $self->storage_type;
     try {
         $self->ensure_class_loaded($impl)
@@ -232,13 +232,28 @@ sub _merge_state_from {
 
     $self->_copy_state_from($from);
 
-    $self->class_mappings(merge($orig_class_mappings, $self->class_mappings))
+    $self->class_mappings(__merge($orig_class_mappings, $self->class_mappings))
         if $orig_class_mappings;
 
-    $self->source_registrations(merge($orig_source_registrations, $self->source_registrations))
+    $self->source_registrations(__merge($orig_source_registrations, $self->source_registrations))
         if $orig_source_registrations;
 }
 
+my $merger;
+sub __merge {
+
+  local $SIG{__WARN__} = sigwarn_silencer(qr/Arguments for _merge_hashes must be hash references/);
+
+  ( $merger ||= do {
+    require Hash::Merge;
+    my $m = Hash::Merge->new('LEFT_PRECEDENT');
+    $m->set_clone_behavior(0);
+    $m;
+  } )->merge(
+    $_[0], $_[1]
+  );
+}
+
 sub _copy_state_from {
     my $self = shift;
     my ($from) = @_;
@@ -341,7 +356,7 @@ sub connection {
         # ->load_components and we are now in a different place in the mro.
         no warnings 'redefine';
 
-        local *connection = subname __PACKAGE__.'::connection' => sub {
+        local *connection = set_subname __PACKAGE__.'::connection' => sub {
             my $self = shift;
             $self->next::method(@_);
         };
@@ -460,11 +475,11 @@ sub import {
         }
         elsif($opt eq 'naming') {
             no strict 'refs';
-            *{"${cpkg}::naming"} = sub { $self->naming(@_) };
+            *{"${cpkg}::naming"} = $self->curry::naming;
         }
         elsif($opt eq 'use_namespaces') {
             no strict 'refs';
-            *{"${cpkg}::use_namespaces"} = sub { $self->use_namespaces(@_) };
+            *{"${cpkg}::use_namespaces"} = $self->curry::use_namespaces,
         }
     }
 }
@@ -611,76 +626,87 @@ Based on L<DBIx::Class::Loader> by Sebastian Riedel
 
 Based upon the work of IKEBE Tomohiro
 
-=head1 AUTHOR
+=head1 AUTHORS
 
-blblack: Brandon Black <blblack@gmail.com>
+Caelum: Rafael Kitover <rkitover@cpan.org>
 
-=head1 CONTRIBUTORS
+Dag-Erling Smørgrav <des@des.no>
 
-ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
+Matias E. Fernandez <mfernandez@pisco.ch>
+
+SineSwiper: Brendan Byrd <byrd.b@insightcom.com>
+
+TSUNODA Kazuya <drk@drk7.jp>
+
+acmoore: Andrew Moore <amoore@cpan.org>
+
+alnewkirk: Al Newkirk <awncorp@cpan.org>
+
+andrewalker: André Walker <andre@andrewalker.net>
+
+angelixd: Paul C. Mantz <pcmantz@cpan.org>
+
+arc: Aaron Crane <arc@cpan.org>
 
 arcanez: Justin Hunter <justin.d.hunter@gmail.com>
 
 ash: Ash Berlin <ash@cpan.org>
 
-btilly: Ben Tilly <btilly@gmail.com>
+blblack: Brandon Black <blblack@gmail.com>
 
-Caelum: Rafael Kitover <rkitover@cpan.org>
+bphillips: Brian Phillips <bphillips@cpan.org>
 
-TSUNODA Kazuya <drk@drk7.jp>
+btilly: Ben Tilly <btilly@gmail.com>
 
-rbo: Robert Bohne <rbo@cpan.org>
+domm: Thomas Klausner <domm@plix.at>
 
-ribasushi: Peter Rabbitson <ribasushi@cpan.org>
+ether: Karen Etheridge <ether@cpan.org>
 
 gugu: Andrey Kostenko <a.kostenko@rambler-co.ru>
 
+hobbs: Andrew Rodland <arodland@cpan.org>
+
+ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
+
 jhannah: Jay Hannah <jay@jays.net>
 
 jnap: John Napiorkowski <jjn1056@yahoo.com>
 
-rbuels: Robert Buels <rbuels@gmail.com>
+kane: Jos Boumans <kane@cpan.org>
 
-timbunce: Tim Bunce <timb@cpan.org>
+mattp: Matt Phillips <mattp@cpan.org>
+
+mephinet: Philipp Gortan <philipp.gortan@apa.at>
+
+moritz: Moritz Lenz <moritz@faui2k3.org>
 
 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
 
 mstratman: Mark A. Stratman <stratman@gmail.com>
 
-kane: Jos Boumans <kane@cpan.org>
+oalders: Olaf Alders <olaf@wundersolutions.com>
 
-waawaamilk: Nigel McNie <nigel@mcnie.name>
+rbo: Robert Bohne <rbo@cpan.org>
 
-acmoore: Andrew Moore <amoore@cpan.org>
+rbuels: Robert Buels <rbuels@gmail.com>
 
-bphillips: Brian Phillips <bphillips@cpan.org>
+ribasushi: Peter Rabbitson <ribasushi@cpan.org>
 
 schwern: Michael G. Schwern <mschwern@cpan.org>
 
-SineSwiper: Brendan Byrd <byrd.b@insightcom.com>
-
-hobbs: Andrew Rodland <arodland@cpan.org>
-
-domm: Thomas Klausner <domm@plix.at>
-
 spb: Stephen Bennett <spb@exherbo.org>
 
-Matias E. Fernandez <mfernandez@pisco.ch>
-
-alnewkirk: Al Newkirk <awncorp@cpan.org>
-
-angelixd: Paul C. Mantz <pcmantz@cpan.org>
+timbunce: Tim Bunce <timb@cpan.org>
 
-andrewalker: André Walker <andre@andrewalker.net>
+waawaamilk: Nigel McNie <nigel@mcnie.name>
 
 ... and lots of other folks. If we forgot you, please write the current
 maintainer or RT.
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright (c) 2006 - 2009 by the aforementioned
-L<DBIx::Class::Schema::Loader/AUTHOR> and
-L<DBIx::Class::Schema::Loader/CONTRIBUTORS>.
+Copyright (c) 2006 - 2015 by the aforementioned
+L<DBIx::Class::Schema::Loader/AUTHORS>.
 
 This library is free software; you can redistribute it and/or modify it under
 the same terms as Perl itself.