},
},
+ _types_common => {
+ req => {
+ 'Type::Utils' => '0',
+ 'Type::Library' => '0',
+ 'Types::Standard' => '0',
+ 'Types::LoadableClass' => '0',
+ },
+ },
+
# a common placeholder for engines with IC::DT support based off DT::F::S
_icdt_strptime_based => {
augment => {
},
replicated => {
- req => $moose_basic,
+ include => '_types_common',
pod => {
title => 'Storage::Replicated',
desc => 'Modules required for L<DBIx::Class::Storage::DBI::Replicated>',
test_replicated => {
include => 'replicated',
- req => {
- 'Test::Moose' => '0',
- },
},
admin => {
test_strictures => {
req => {
- 'Test::Strict' => '0.20',
+ 'Test::Strict' => '0.24',
},
release_testing_mandatory => 1,
},
}
}
-use Moose;
+use Moo;
use DBIx::Class::Storage::DBI;
use DBIx::Class::Storage::DBI::Replicated::Pool;
use DBIx::Class::Storage::DBI::Replicated::Balancer;
use DBIx::Class::Storage::DBI::Replicated::Types qw/BalancerClassNamePart DBICSchema DBICStorageDBI/;
-use MooseX::Types::Moose qw/ClassName HashRef Object/;
-use Scalar::Util 'reftype';
+use Types::Standard qw/ClassName HashRef Object/;
+use Type::Utils qw(class_type role_type);
+use Scalar::Util qw(reftype blessed);
+use Sub::Name qw(subname);
use Hash::Merge;
use List::Util qw/min max reduce/;
use Context::Preserve 'preserve_context';
+use Class::Inspector;
use Try::Tiny;
-use namespace::clean -except => 'meta';
+use namespace::clean;
=head1 NAME
has 'pool' => (
is=>'ro',
- isa=>'DBIx::Class::Storage::DBI::Replicated::Pool',
- lazy_build=>1,
+ isa=>class_type('DBIx::Class::Storage::DBI::Replicated::Pool'),
+ lazy=>1,
+ builder=>1,
+ predicate=>1,
+ clearer=>1,
handles=>[qw/
connect_replicants
replicants
has 'balancer' => (
is=>'rw',
- isa=>'DBIx::Class::Storage::DBI::Replicated::Balancer',
- lazy_build=>1,
+ isa=>role_type('DBIx::Class::Storage::DBI::Replicated::Balancer'),
+ lazy=>1,
+ builder=>1,
+ predicate=>1,
+ clearer=>1,
handles=>[qw/auto_validate_every/],
);
has 'master' => (
is=> 'ro',
isa=>DBICStorageDBI,
- lazy_build=>1,
+ lazy=>1,
+ builder=>1,
+ predicate=>1,
+ clearer=>1,
);
=head1 ATTRIBUTES IMPLEMENTING THE DBIx::Storage::DBI INTERFACE
_execute
_do_query
_dbh_execute
- /, Class::MOP::Class->initialize('DBIx::Class::Storage::DBIHacks')->get_method_list ],
+ /, @{Class::Inspector->functions('DBIx::Class::Storage::DBIHacks')} ],
reader => [qw/
select
select_single
_bind_sth_params
/,(
# the capability framework
- # not sure if CMOP->initialize does evil things to DBIC::S::DBI, fix if a problem
grep
{ $_ =~ /^ _ (?: use | supports | determine_supports ) _ /x and $_ ne '_use_multicolumn_in' }
- ( Class::MOP::Class->initialize('DBIx::Class::Storage::DBI')->get_all_method_names )
+ @{Class::Inspector->functions('DBIx::Class::Storage::DBI')}
)],
};
}
for my $method (@{$method_dispatch->{unimplemented}}) {
- __PACKAGE__->meta->add_method($method, sub {
+ no strict 'refs';
+ *{$method} = subname $method, sub {
my $self = shift;
$self->throw_exception("$method() must not be called on ".(blessed $self).' objects');
- });
+ };
}
=head2 read_handler
has 'read_handler' => (
is=>'rw',
isa=>Object,
- lazy_build=>1,
+ lazy=>1,
+ builder=>1,
+ predicate=>1,
+ clearer=>1,
handles=>$method_dispatch->{reader},
);
has 'write_handler' => (
is=>'ro',
isa=>Object,
- lazy_build=>1,
+ lazy=>1,
+ builder=>1,
+ predicate=>1,
+ clearer=>1,
handles=>$method_dispatch->{writer},
);
# Make sure master is blessed into the correct class and apply role to it.
my $master = $self->master;
$master->_determine_driver;
- Moose::Meta::Class->initialize(ref $master);
- DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($master);
+ Moo::Role->apply_roles_to_object(
+ $master,
+ 'DBIx::Class::Storage::DBI::Replicated::WithDSN',
+ );
# link pool back to master
$self->pool->master($master);
=cut
-__PACKAGE__->meta->make_immutable;
-
1;
package DBIx::Class::Storage::DBI::Replicated::Balancer;
-use Moose::Role;
+use Moo::Role;
requires 'next_storage';
-use MooseX::Types::Moose qw/Int/;
+use Types::Standard qw/Int/;
+use Type::Utils qw/class_type/;
+use Scalar::Util qw/blessed/;
use DBIx::Class::Storage::DBI::Replicated::Pool;
use DBIx::Class::Storage::DBI::Replicated::Types qw/DBICStorageDBI/;
-use namespace::clean -except => 'meta';
+use namespace::clean;
=head1 NAME
has 'pool' => (
is=>'ro',
- isa=>'DBIx::Class::Storage::DBI::Replicated::Pool',
+ isa=>class_type('DBIx::Class::Storage::DBI::Replicated::Pool'),
required=>1,
);
has 'current_replicant' => (
is=> 'rw',
isa=>DBICStorageDBI,
- lazy_build=>1,
+ lazy=>1,
+ builder=>1,
+ predicate=>1,
+ clearer=>1,
handles=>[qw/
select
select_single
package DBIx::Class::Storage::DBI::Replicated::Balancer::First;
-use Moose;
+use Moo;
with 'DBIx::Class::Storage::DBI::Replicated::Balancer';
-use namespace::clean -except => 'meta';
+use namespace::clean;
=head1 NAME
=cut
-__PACKAGE__->meta->make_immutable;
-
1;
package DBIx::Class::Storage::DBI::Replicated::Balancer::Random;
-use Moose;
+use Moo;
with 'DBIx::Class::Storage::DBI::Replicated::Balancer';
use DBIx::Class::Storage::DBI::Replicated::Types 'Weight';
-use namespace::clean -except => 'meta';
+use namespace::clean;
=head1 NAME
=cut
-__PACKAGE__->meta->make_immutable;
-
1;
package DBIx::Class::Storage::DBI::Replicated::Pool;
-use Moose;
+use Moo;
use DBIx::Class::Storage::DBI::Replicated::Replicant;
use List::Util 'sum';
use Scalar::Util 'reftype';
use DBI ();
-use MooseX::Types::Moose qw/Num Int ClassName HashRef/;
+use Types::Standard qw/Num Int ClassName HashRef Object/;
use DBIx::Class::Storage::DBI::Replicated::Types 'DBICStorageDBI';
use Try::Tiny;
has 'maximum_lag' => (
is=>'rw',
isa=>Num,
- required=>1,
lazy=>1,
default=>0,
);
has 'replicants' => (
is=>'rw',
- traits => ['Hash'],
- isa=>HashRef['Object'],
+ isa=>HashRef[Object],
default=>sub {{}},
- handles => {
- 'set_replicant' => 'set',
- 'get_replicant' => 'get',
- 'has_replicants' => 'is_empty',
- 'num_replicants' => 'count',
- 'delete_replicant' => 'delete',
- 'all_replicant_storages' => 'values',
- },
);
-around has_replicants => sub {
- my ($orig, $self) = @_;
- return !$self->$orig;
-};
+sub set_replicant { $_[0]->replicants->{$_[1]} = $_[2] }
+sub get_replicant { $_[0]->replicants->{$_[1]} }
+sub has_replicants { !!keys %{$_[0]->replicants} }
+sub num_replicants { 0+keys %{$_[0]->replicants} }
+sub delete_replicant { delete $_[0]->replicants->{$_[1]} }
+sub all_replicant_storages { values %{$_[0]->replicants} }
has next_unknown_replicant_id => (
is => 'rw',
- traits => ['Counter'],
isa => Int,
default => 1,
- handles => {
- 'inc_unknown_replicant_id' => 'inc',
- },
);
+sub inc_unknown_replicant_id {
+ my ($self) = @_;
+ $self->next_unknown_replicant_id($self->next_unknown_replicant_id + 1);
+}
+
=head2 master
Reference to the master Storage.
$replicant->_determine_driver
});
- Moose::Meta::Class->initialize(ref $replicant);
-
- DBIx::Class::Storage::DBI::Replicated::Replicant->meta->apply($replicant);
+ Moo::Role->apply_roles_to_object(
+ $replicant,
+ 'DBIx::Class::Storage::DBI::Replicated::Replicant',
+ );
# link back to master
$replicant->master($self->master);
=cut
-__PACKAGE__->meta->make_immutable;
-
1;
package DBIx::Class::Storage::DBI::Replicated::Replicant;
-use Moose::Role;
+use Moo::Role;
requires qw/_query_start/;
with 'DBIx::Class::Storage::DBI::Replicated::WithDSN';
-use MooseX::Types::Moose qw/Bool Str/;
+use Types::Standard qw/Bool Str/;
use DBIx::Class::Storage::DBI::Replicated::Types 'DBICStorageDBI';
-use namespace::clean -except => 'meta';
+use namespace::clean;
=head1 NAME
# DBIx::Class::Storage::DBI::Replicated::Types - Types used internally by
# L<DBIx::Class::Storage::DBI::Replicated>
-# Workaround for https://rt.cpan.org/Public/Bug/Display.html?id=83336
use warnings;
use strict;
-use MooseX::Types
- -declare => [qw/BalancerClassNamePart Weight DBICSchema DBICStorageDBI/];
-use MooseX::Types::Moose qw/ClassName Str Num/;
-use MooseX::Types::LoadableClass qw/LoadableClass/;
+use Type::Library
+ -base,
+ -declare => qw/BalancerClassNamePart Weight DBICSchema DBICStorageDBI/;
+use Type::Utils -all;
+use Types::Standard qw/Str Num/;
+use Types::LoadableClass qw/LoadableClass/;
-class_type 'DBIx::Class::Storage::DBI';
-class_type 'DBIx::Class::Schema';
-
-subtype DBICSchema, as 'DBIx::Class::Schema';
-subtype DBICStorageDBI, as 'DBIx::Class::Storage::DBI';
+class_type DBICSchema, { class => 'DBIx::Class::Schema' };
+class_type DBICStorageDBI, { class => 'DBIx::Class::Storage::DBI' };
subtype BalancerClassNamePart,
as LoadableClass;
package DBIx::Class::Storage::DBI::Replicated::WithDSN;
-use Moose::Role;
+use Moo::Role;
use Scalar::Util 'reftype';
requires qw/_query_start/;
use Try::Tiny;
-use namespace::clean -except => 'meta';
+use namespace::clean;
=head1 NAME
use DBIx::Class::_Util 'modver_gt_or_eq_and_lt';
use lib qw(t/lib);
use DBICTest;
-
-BEGIN {
- plan skip_all => "A trial version of Moose detected known to break replication - skipping test known to fail" if (
- DBICTest::RunMode->is_smoker
- and
- modver_gt_or_eq_and_lt( 'Moose', '1.99', '1.9903' )
- )
-}
-
-use Test::Moose;
+use Class::Inspector;
use Test::Exception;
use List::Util 'first';
use Scalar::Util 'reftype';
use File::Spec;
-use Moose();
-use MooseX::Types();
-note "Using Moose version $Moose::VERSION and MooseX::Types version $MooseX::Types::VERSION";
+use Moo::Role ();
my $var_dir = quotemeta ( File::Spec->catdir(qw/t var/) );
{
package DBIx::Class::Storage::DBI::Replicated;
- use Moose;
-
- __PACKAGE__->meta->make_mutable;
+ use Moo;
around connect_info => sub {
my ($next, $self, $info) = @_;
$self->$next($info);
};
- __PACKAGE__->meta->make_immutable;
-
- no Moose;
}
-
+sub does_ok($$;$) {
+ my ($thing, $role, $desc) = @_;
+ $desc ||= 'The object';
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+ ok Moo::Role::does_role($thing, $role), "$desc does $role";
+}
=head1 HOW TO USE
### check that all Storage::DBI methods are handled by ::Replicated
{
- my @storage_dbi_methods = Class::MOP::Class
- ->initialize('DBIx::Class::Storage::DBI')->get_all_method_names;
+ my @storage_dbi_methods = @{Class::Inspector
+ ->methods('DBIx::Class::Storage::DBI')};
- my @replicated_methods = DBIx::Class::Storage::DBI::Replicated->meta
- ->get_all_method_names;
+ my @replicated_methods = @{Class::Inspector
+ ->methods('DBIx::Class::Storage::DBI::Replicated')};
# remove constants and OTHER_CRAP
@storage_dbi_methods = grep !/^[A-Z_]+\z/, @storage_dbi_methods;
@storage_dbi_methods = grep !/_accessor\z/, @storage_dbi_methods;
# remove DBIx::Class (the root parent, with CAG and stuff) methods
- my @root_methods = Class::MOP::Class->initialize('DBIx::Class')
- ->get_all_method_names;
+ my @root_methods = @{Class::Inspector->methods('DBIx::Class')};
my %count;
$count{$_}++ for (@storage_dbi_methods, @root_methods);
}
}
-ok $replicated->schema->storage->meta
- => 'has a meta object';
-
isa_ok $replicated->schema->storage->master
=> 'DBIx::Class::Storage::DBI';
/]
},
- 'DBIx::Class::Storage::DBI::Replicated*' => {
+ 'DBIx::Class::Storage::DBI::Replicated' => {
ignore => [ qw/
connect_call_do_sql
disconnect_call_do_sql
+ get_dbms_capability
+ get_use_dbms_capability
+ set_dbms_capability
+ set_use_dbms_capability
+ sql_limit_dialect
+ sql_name_sep
+ sql_quote_char
+ has_balancer
+ has_master
+ has_pool
+ has_read_handler
+ has_write_handler
+ /]
+ },
+
+ 'DBIx::Class::Storage::DBI::Replicated::Balanced' => {
+ ignore => [ qw/
+ has_auto_validate_every
/]
},