-package Catalyst::Model::DBIC::Schema::Types;
+package # hide from PAUSE
+ Catalyst::Model::DBIC::Schema::Types;
-use MooseX::Types
- -declare => [qw/ConnectInfo ConnectInfos Replicants SchemaClass/];
+use MooseX::Types -declare => [qw/
+ ConnectInfo ConnectInfos Replicants LoadedClass CreateOption
+/];
+use Carp::Clan '^Catalyst::Model::DBIC::Schema';
use MooseX::Types::Moose qw/ArrayRef HashRef Str ClassName/;
use Scalar::Util 'reftype';
use List::MoreUtils 'all';
-use Carp;
use namespace::clean -except => 'meta';
-subtype SchemaClass,
+class_type 'DBIx::Class::Schema';
+
+subtype LoadedClass,
as ClassName;
-coerce SchemaClass,
+coerce LoadedClass,
from Str,
via { Class::MOP::load_class($_); $_ };
coerce ConnectInfo,
from Str,
- via { +{ dsn => $_ } },
+ via(\&_coerce_connect_info_from_str),
from ArrayRef,
- via \&_coerce_connect_info_from_arrayref;
+ via(\&_coerce_connect_info_from_arrayref);
# { connect_info => [ ... ] } coercion would be nice, but no chained coercions
# yet.
coerce ConnectInfos,
from Str,
- via { [ { dsn => $_ } ] },
- from ArrayRef[Str],
- via { [ map +{ dsn => $_ }, @$_ ] },
- from ArrayRef[ArrayRef],
- via { [ map \&_coerce_connect_info_from_arrayref, @$_ ] };
+ via { [ _coerce_connect_info_from_str() ] },
+ from ArrayRef,
+ via { [ map {
+ !ref $_ ? _coerce_connect_info_from_str()
+ : reftype $_ eq 'HASH' ? $_
+ : reftype $_ eq 'ARRAY' ? _coerce_connect_info_from_arrayref()
+ : die 'invalid connect_info'
+ } @$_ ] };
+
+# Helper stuff
+
+subtype CreateOption,
+ as Str,
+ where { /^(?:static|dynamic)\z/ },
+ message { "Invalid create option, must be one of 'static' or 'dynamic'" };
sub _coerce_connect_info_from_arrayref {
my %connect_info;
+ # make a copy
+ $_ = [ @$_ ];
+
if (!ref $_->[0]) { # array style
$connect_info{dsn} = shift @$_;
$connect_info{user} = shift @$_ if !ref $_->[0];
for my $i (0..1) {
my $extra = shift @$_;
last unless $extra;
- croak "invalid connect_info" unless reftype $extra eq 'HASH';
+ die "invalid connect_info" unless reftype $extra eq 'HASH';
%connect_info = (%connect_info, %$extra);
}
- croak "invalid connect_info" if @$_;
+ die "invalid connect_info" if @$_;
} elsif (@$_ == 1 && reftype $_->[0] eq 'HASH') {
return $_->[0];
} else {
- croak "invalid connect_info";
+ die "invalid connect_info";
+ }
+
+ for my $key (qw/user password/) {
+ $connect_info{$key} = ''
+ if not defined $connect_info{$key};
}
\%connect_info;
}
+sub _coerce_connect_info_from_str {
+ +{ dsn => $_, user => '', password => '' }
+}
+
1;