mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-25 05:44:59 +00:00
Merged use-lmo.
This commit renames our fork of Mo to Lmo, since the two have diverged a huge deal. The merged branch streamlined Lmo a great deal as well, for maintainability.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
package Bar;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
extends 'Foo';
|
||||
1;
|
@@ -1,5 +1,5 @@
|
||||
package Boo;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
|
||||
has 'buff';
|
||||
|
@@ -1,5 +1,5 @@
|
||||
package Foo;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
|
||||
has 'stuff';
|
||||
|
@@ -14,31 +14,31 @@ use Test::More;
|
||||
$main::count = 1;
|
||||
|
||||
package Foo;
|
||||
use Mo 'build';
|
||||
use Lmo 'build';
|
||||
has 'foo' => (is => 'rw');
|
||||
sub BUILD {
|
||||
my $self = shift;
|
||||
::is_deeply(\@_, [qw(stuff 1)], "Foo's BUILD doesn't get the class name");
|
||||
::is_deeply([sort @_], [sort qw(stuff 1)], "Foo's BUILD doesn't get the class name");
|
||||
$self->foo($main::count++);
|
||||
}
|
||||
|
||||
package Bar;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
extends 'Foo';
|
||||
has 'bar' => (is => 'rw');
|
||||
|
||||
package Baz;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
extends 'Bar';
|
||||
has 'baz' => (is => 'rw');
|
||||
sub BUILD {
|
||||
my $self = shift;
|
||||
::is_deeply(\@_, [qw(stuff 1)], "Baz's BUILD doesn't get the class name");
|
||||
::is_deeply([sort @_], [sort qw(stuff 1)], "Baz's BUILD doesn't get the class name");
|
||||
$self->baz($main::count++);
|
||||
}
|
||||
|
||||
package Gorch;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
extends 'Baz';
|
||||
has 'gorch' => (is => 'rw');
|
||||
|
@@ -15,13 +15,13 @@ $main::count = 0;
|
||||
|
||||
{
|
||||
package Nothing;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
has nothing_special => ( is => 'rw' );
|
||||
}
|
||||
ok(Nothing->can("BUILDARGS"), "Every class automatically gets buildargs");
|
||||
|
||||
package Foo;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
has 'foo' => (is => 'rw');
|
||||
sub BUILDARGS {
|
||||
my $class = shift;
|
||||
@@ -30,12 +30,12 @@ sub BUILDARGS {
|
||||
}
|
||||
|
||||
package Bar;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
extends 'Foo';
|
||||
has 'bar' => (is => 'rw');
|
||||
|
||||
package Baz;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
extends 'Bar';
|
||||
has 'baz' => (is => 'rw');
|
||||
sub BUILDARGS {
|
||||
@@ -45,7 +45,7 @@ sub BUILDARGS {
|
||||
}
|
||||
|
||||
package Gorch;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
extends 'Baz';
|
||||
has 'gorch' => (is => 'rw');
|
||||
|
||||
@@ -53,7 +53,7 @@ package main;
|
||||
|
||||
$main::count = 0;
|
||||
my $g = Foo->new;
|
||||
is $main::count, 1, "A class with no explicit parent inherits SUPER::BUILDARGS from Mo::Object";
|
||||
is $main::count, 1, "A class with no explicit parent inherits SUPER::BUILDARGS from Lmo::Object";
|
||||
|
||||
$main::count = 0;
|
||||
$g = Gorch->new;
|
@@ -12,7 +12,7 @@ use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
package Foo::coerce;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
|
||||
has 'stuff' => (coerce => sub { uc $_[0] });
|
||||
|
@@ -11,7 +11,7 @@ use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
use lib "$ENV{PERCONA_TOOLKIT_BRANCH}/t/lib/Mo";
|
||||
use lib "$ENV{PERCONA_TOOLKIT_BRANCH}/t/lib/Lmo";
|
||||
use Bar;
|
||||
|
||||
my $b = Bar->new;
|
@@ -21,14 +21,14 @@ use Test::More;
|
||||
|
||||
{
|
||||
package Foo;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
has 'bar' => (is => 'rw', default => sub { 10 });
|
||||
|
||||
sub baz { 42 }
|
||||
|
||||
package Bar;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
has 'foo' => (
|
||||
is => 'rw',
|
||||
@@ -99,13 +99,13 @@ is($bar->foo_bar, 20, '... correctly curried a single argument');
|
||||
|
||||
{
|
||||
package Engine;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
sub go { 'Engine::go' }
|
||||
sub stop { 'Engine::stop' }
|
||||
|
||||
package Car;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
has 'engine' => (
|
||||
is => 'rw',
|
||||
@@ -137,14 +137,14 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop');
|
||||
|
||||
{
|
||||
package Baz;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
sub foo { 'Baz::foo' }
|
||||
sub bar { 'Baz::bar' }
|
||||
sub boo { 'Baz::boo' }
|
||||
|
||||
package Baz::Proxy1;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
has 'baz' => (
|
||||
is => 'ro',
|
||||
@@ -154,7 +154,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop');
|
||||
);
|
||||
|
||||
package Baz::Proxy2;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
has 'baz' => (
|
||||
is => 'ro',
|
||||
@@ -164,7 +164,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop');
|
||||
);
|
||||
|
||||
package Baz::Proxy3;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
has 'baz' => (
|
||||
is => 'ro',
|
||||
@@ -228,14 +228,14 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop');
|
||||
requires 'bar';
|
||||
|
||||
package Foo::Baz;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
sub foo { 'Foo::Baz::FOO' }
|
||||
sub bar { 'Foo::Baz::BAR' }
|
||||
sub baz { 'Foo::Baz::BAZ' }
|
||||
|
||||
package Foo::Thing;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
has 'thing' => (
|
||||
is => 'rw',
|
||||
@@ -244,7 +244,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop');
|
||||
);
|
||||
|
||||
package Foo::OtherThing;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
use Moose::Util::TypeConstraints;
|
||||
|
||||
has 'other_thing' => (
|
||||
@@ -288,7 +288,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop');
|
||||
|
||||
{
|
||||
package Foo::Autoloaded;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
sub AUTOLOAD {
|
||||
my $self = shift;
|
||||
@@ -304,7 +304,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop');
|
||||
}
|
||||
|
||||
package Bar::Autoloaded;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
has 'foo' => (
|
||||
is => 'rw',
|
||||
@@ -313,7 +313,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop');
|
||||
);
|
||||
|
||||
package Baz::Autoloaded;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
has 'foo' => (
|
||||
is => 'rw',
|
||||
@@ -322,7 +322,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop');
|
||||
);
|
||||
|
||||
package Goorch::Autoloaded;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
eval {
|
||||
has 'foo' => (
|
||||
@@ -447,7 +447,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop');
|
||||
|
||||
{
|
||||
package Delegator;
|
||||
use Mo qw(is required handles default builder);
|
||||
use Lmo qw(is required handles default builder);
|
||||
|
||||
sub full { 1 }
|
||||
sub stub;
|
@@ -15,7 +15,7 @@ use Test::More;
|
||||
|
||||
{
|
||||
package Foo;
|
||||
use Mo qw( is init_arg );
|
||||
use Lmo qw( is init_arg );
|
||||
|
||||
eval {
|
||||
has 'foo' => (
|
||||
@@ -64,7 +64,7 @@ use Test::More;
|
||||
|
||||
{
|
||||
package Foo2;
|
||||
use Mo qw( is init_arg clearer default );
|
||||
use Lmo qw( is init_arg clearer default );
|
||||
|
||||
my $counter;
|
||||
eval {
|
@@ -12,7 +12,7 @@ use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
package Foo::is;
|
||||
use Mo qw(is);
|
||||
use Lmo qw(is);
|
||||
|
||||
has 'stuff' => (is => 'ro');
|
||||
|
@@ -29,7 +29,7 @@ sub lives_ok (&;$) {
|
||||
}
|
||||
|
||||
package Foo::isa;
|
||||
use Mo qw(isa);
|
||||
use Lmo qw(isa);
|
||||
|
||||
my @types = qw(Bool Num Int Str ArrayRef CodeRef HashRef RegexpRef);
|
||||
my @refs = ([], sub { }, {}, qr( ));
|
||||
@@ -191,11 +191,11 @@ my $thisperl = $^X;
|
||||
if ($^O ne 'VMS')
|
||||
{$thisperl .= $Config{_exe} unless $thisperl =~ m/$Config{_exe}$/i;}
|
||||
|
||||
my $pm_test = "$PerconaTest::trunk/t/lib/Mo/isa_subtest.pm";
|
||||
my $pm_test = "$PerconaTest::trunk/t/lib/Lmo/isa_subtest.pm";
|
||||
|
||||
ok(
|
||||
scalar(IPC::Cmd::run(command => [$thisperl, $pm_test])),
|
||||
"Mo types work with Scalar::Util::PP",
|
||||
"Lmo types work with Scalar::Util::PP",
|
||||
);
|
||||
|
||||
done_testing;
|
@@ -16,7 +16,7 @@ use warnings;
|
||||
|
||||
{
|
||||
package isa_subtest;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
|
||||
has attr => (
|
||||
is => 'rw',
|
83
t/lib/Lmo/meta.t
Normal file
83
t/lib/Lmo/meta.t
Normal file
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
BEGIN {
|
||||
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
|
||||
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
|
||||
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
|
||||
};
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
sub throws_ok (&;$) {
|
||||
my ( $code, $pat, $msg ) = @_;
|
||||
eval { $code->(); };
|
||||
like ( $EVAL_ERROR, $pat, $msg );
|
||||
}
|
||||
|
||||
{
|
||||
package Metatest;
|
||||
use Lmo;
|
||||
|
||||
has stuff => ( is => 'rw', required => 1 );
|
||||
has init_stuff1 => ( is => 'rw', init_arg => undef );
|
||||
has init_stuff2 => ( is => 'rw', init_arg => 'fancy_name' );
|
||||
}
|
||||
{
|
||||
package Metatest::child;
|
||||
use Lmo;
|
||||
extends 'Metatest';
|
||||
|
||||
has more_stuff => ( is => 'rw' );
|
||||
}
|
||||
|
||||
my $obj = Metatest->new( stuff => 100 );
|
||||
|
||||
can_ok($obj, 'meta');
|
||||
|
||||
my $meta = $obj->meta();
|
||||
|
||||
is_deeply(
|
||||
[ sort $meta->attributes ],
|
||||
[ sort qw(stuff init_stuff1 init_stuff2) ],
|
||||
"->attributes works"
|
||||
);
|
||||
|
||||
is_deeply(
|
||||
[ sort $meta->attributes_for_new ],
|
||||
[ sort qw(stuff fancy_name) ],
|
||||
"->attributes_for_new works"
|
||||
);
|
||||
|
||||
# Do these BEFORE initializing ::extends
|
||||
my $meta2 = Metatest::child->meta();
|
||||
is_deeply(
|
||||
[ sort $meta2->attributes ],
|
||||
[ sort qw(stuff init_stuff1 init_stuff2 more_stuff) ],
|
||||
"->attributes works on a child class"
|
||||
);
|
||||
|
||||
is_deeply(
|
||||
[ sort $meta2->attributes_for_new ],
|
||||
[ sort qw(stuff fancy_name more_stuff) ],
|
||||
"->attributes_for_new works in a child class"
|
||||
);
|
||||
|
||||
my $meta3 = Metatest::child->new(stuff => 10)->meta();
|
||||
is_deeply(
|
||||
[ sort $meta3->attributes ],
|
||||
[ sort qw(stuff init_stuff1 init_stuff2 more_stuff) ],
|
||||
"->attributes works on an initialized child class"
|
||||
);
|
||||
|
||||
is_deeply(
|
||||
[ sort $meta3->attributes_for_new ],
|
||||
[ sort qw(stuff fancy_name more_stuff) ],
|
||||
"->attributes_for_new works in an initialized child class"
|
||||
);
|
||||
|
||||
throws_ok { Metatest::child->new() } qr/\QAttribute (stuff) is required for Metatest::child/;
|
||||
|
||||
done_testing;
|
83
t/lib/Lmo/meta.t.moved
Normal file
83
t/lib/Lmo/meta.t.moved
Normal file
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
BEGIN {
|
||||
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
|
||||
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
|
||||
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
|
||||
};
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
sub throws_ok (&;$) {
|
||||
my ( $code, $pat, $msg ) = @_;
|
||||
eval { $code->(); };
|
||||
like ( $EVAL_ERROR, $pat, $msg );
|
||||
}
|
||||
|
||||
{
|
||||
package Metatest;
|
||||
use Lmo;
|
||||
|
||||
has stuff => ( is => 'rw', required => 1 );
|
||||
has init_stuff1 => ( is => 'rw', init_arg => undef );
|
||||
has init_stuff2 => ( is => 'rw', init_arg => 'fancy_name' );
|
||||
}
|
||||
{
|
||||
package Metatest::child;
|
||||
use Lmo;
|
||||
extends 'Metatest';
|
||||
|
||||
has more_stuff => ( is => 'rw' );
|
||||
}
|
||||
|
||||
my $obj = Metatest->new( stuff => 100 );
|
||||
|
||||
can_ok($obj, 'meta');
|
||||
|
||||
my $meta = $obj->meta();
|
||||
|
||||
is_deeply(
|
||||
[ sort $meta->attributes ],
|
||||
[ sort qw(stuff init_stuff1 init_stuff2) ],
|
||||
"->attributes works"
|
||||
);
|
||||
|
||||
is_deeply(
|
||||
[ sort $meta->attributes_for_new ],
|
||||
[ sort qw(stuff fancy_name) ],
|
||||
"->attributes_for_new works"
|
||||
);
|
||||
|
||||
# Do these BEFORE initializing ::extends
|
||||
my $meta2 = Metatest::child->meta();
|
||||
is_deeply(
|
||||
[ sort $meta2->attributes ],
|
||||
[ sort qw(stuff init_stuff1 init_stuff2 more_stuff) ],
|
||||
"->attributes works on a child class"
|
||||
);
|
||||
|
||||
is_deeply(
|
||||
[ sort $meta2->attributes_for_new ],
|
||||
[ sort qw(stuff fancy_name more_stuff) ],
|
||||
"->attributes_for_new works in a child class"
|
||||
);
|
||||
|
||||
my $meta3 = Metatest::child->new(stuff => 10)->meta();
|
||||
is_deeply(
|
||||
[ sort $meta3->attributes ],
|
||||
[ sort qw(stuff init_stuff1 init_stuff2 more_stuff) ],
|
||||
"->attributes works on an initialized child class"
|
||||
);
|
||||
|
||||
is_deeply(
|
||||
[ sort $meta3->attributes_for_new ],
|
||||
[ sort qw(stuff fancy_name more_stuff) ],
|
||||
"->attributes_for_new works in an initialized child class"
|
||||
);
|
||||
|
||||
throws_ok { Metatest::child->new() } qr/\QAttribute (stuff) is required for Metatest::child/;
|
||||
|
||||
done_testing;
|
@@ -10,7 +10,7 @@ use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
use lib "$ENV{PERCONA_TOOLKIT_BRANCH}/t/lib/Mo";
|
||||
use lib "$ENV{PERCONA_TOOLKIT_BRANCH}/t/lib/Lmo";
|
||||
|
||||
{ package Clean; use Foo; }
|
||||
|
@@ -13,14 +13,14 @@ use Test::More;
|
||||
|
||||
#============
|
||||
package Foo::required;
|
||||
use Mo qw(required);
|
||||
use Lmo qw(required);
|
||||
|
||||
has 'stuff' => (required => 1);
|
||||
has 'stuff2' => (required => 1);
|
||||
has 'foo' => ();
|
||||
#============
|
||||
package Foo::required_is;
|
||||
use Mo qw(required);
|
||||
use Lmo qw(required);
|
||||
|
||||
has 'stuff' => (required => 1, is => 'ro');
|
||||
#============
|
||||
@@ -28,7 +28,7 @@ has 'stuff' => (required => 1, is => 'ro');
|
||||
package main;
|
||||
|
||||
my $f0 = eval { Foo::required->new(stuff2 => 'foobar') };
|
||||
like $@, qr/^\QAttribute (stuff) is required/, 'Mo dies when a required value is not provided';
|
||||
like $@, qr/^\QAttribute (stuff) is required/, 'Lmo dies when a required value is not provided';
|
||||
|
||||
my $f = Foo::required->new(stuff => 'fubar', stuff2 => 'foobar');
|
||||
is $f->stuff, 'fubar', 'Object is correctly initialized when required values are provided';
|
72
t/lib/Lmo/role.t
Normal file
72
t/lib/Lmo/role.t
Normal file
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
BEGIN {
|
||||
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
|
||||
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
|
||||
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
|
||||
};
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
BEGIN {
|
||||
my $have_roles = eval { require Role::Tiny };
|
||||
plan skip_all => "Can't load Role::Tiny, not testing Roles"
|
||||
unless $have_roles;
|
||||
}
|
||||
|
||||
{
|
||||
package One::P1; use Lmo::Role;
|
||||
has two => (is => 'ro', default => sub { 'two' });
|
||||
no Lmo::Role;
|
||||
|
||||
package One::P2; use Lmo::Role;
|
||||
has three => (is => 'ro', default => sub { 'three' });
|
||||
no Lmo::Role;
|
||||
|
||||
package One::P3; use Lmo::Role;
|
||||
has four => (is => 'ro', default => sub { 'four' });
|
||||
no Lmo::Role;
|
||||
|
||||
package One; use Lmo;
|
||||
with qw( One::P1 One::P2 );
|
||||
has one => (is => 'ro', default => sub { 'one' });
|
||||
}
|
||||
|
||||
my $combined = One->new();
|
||||
|
||||
ok $combined->does($_), "Does $_" for qw(One::P1 One::P2);
|
||||
|
||||
ok !$combined->does($_), "Doesn't $_" for qw(One::P3 One::P4);
|
||||
|
||||
is $combined->one, "one", "attr default set from class";
|
||||
is $combined->two, "two", "attr default set from role";
|
||||
is $combined->three, "three", "attr default set from role";
|
||||
|
||||
# Testing unimport
|
||||
|
||||
{
|
||||
package Two::P1; use Lmo::Role;
|
||||
has two => (is => 'ro', default => sub { 'two' });
|
||||
no Lmo::Role;
|
||||
|
||||
package Two; use Lmo;
|
||||
with qw(Two::P1);
|
||||
has three => ( is => 'ro', default => sub { 'three' } );
|
||||
no Lmo;
|
||||
}
|
||||
|
||||
my $two = Two->new();
|
||||
|
||||
is
|
||||
$two->two(),
|
||||
'two',
|
||||
"unimporting in a role doesn't remove new attributes";
|
||||
|
||||
for my $class ( qw( Two::P1 Two ) ) {
|
||||
ok !$class->can($_), "...but does remove $_ from $class" for qw(has with extends requires);
|
||||
}
|
||||
|
||||
done_testing;
|
72
t/lib/Lmo/role.t.moved
Normal file
72
t/lib/Lmo/role.t.moved
Normal file
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
BEGIN {
|
||||
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
|
||||
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
|
||||
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
|
||||
};
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
BEGIN {
|
||||
my $have_roles = eval { require Role::Tiny };
|
||||
plan skip_all => "Can't load Role::Tiny, not testing Roles"
|
||||
unless $have_roles;
|
||||
}
|
||||
|
||||
{
|
||||
package One::P1; use Lmo::Role;
|
||||
has two => (is => 'ro', default => sub { 'two' });
|
||||
no Lmo::Role;
|
||||
|
||||
package One::P2; use Lmo::Role;
|
||||
has three => (is => 'ro', default => sub { 'three' });
|
||||
no Lmo::Role;
|
||||
|
||||
package One::P3; use Lmo::Role;
|
||||
has four => (is => 'ro', default => sub { 'four' });
|
||||
no Lmo::Role;
|
||||
|
||||
package One; use Lmo;
|
||||
with qw( One::P1 One::P2 );
|
||||
has one => (is => 'ro', default => sub { 'one' });
|
||||
}
|
||||
|
||||
my $combined = One->new();
|
||||
|
||||
ok $combined->does($_), "Does $_" for qw(One::P1 One::P2);
|
||||
|
||||
ok !$combined->does($_), "Doesn't $_" for qw(One::P3 One::P4);
|
||||
|
||||
is $combined->one, "one", "attr default set from class";
|
||||
is $combined->two, "two", "attr default set from role";
|
||||
is $combined->three, "three", "attr default set from role";
|
||||
|
||||
# Testing unimport
|
||||
|
||||
{
|
||||
package Two::P1; use Lmo::Role;
|
||||
has two => (is => 'ro', default => sub { 'two' });
|
||||
no Lmo::Role;
|
||||
|
||||
package Two; use Lmo;
|
||||
with qw(Two::P1);
|
||||
has three => ( is => 'ro', default => sub { 'three' } );
|
||||
no Lmo;
|
||||
}
|
||||
|
||||
my $two = Two->new();
|
||||
|
||||
is
|
||||
$two->two(),
|
||||
'two',
|
||||
"unimporting in a role doesn't remove new attributes";
|
||||
|
||||
for my $class ( qw( Two::P1 Two ) ) {
|
||||
ok !$class->can($_), "...but does remove $_ from $class" for qw(has with extends requires);
|
||||
}
|
||||
|
||||
done_testing;
|
@@ -11,9 +11,9 @@ use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
eval 'package Foo; use Mo; $x = 1';
|
||||
eval 'package Foo; use Lmo; $x = 1';
|
||||
|
||||
like $@, qr/Global symbol "\$x" requires explicit package name/,
|
||||
'Mo is strict';
|
||||
'Lmo is strict';
|
||||
|
||||
done_testing;
|
@@ -13,18 +13,18 @@ use Test::More;
|
||||
|
||||
#============
|
||||
package Foo;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
|
||||
has 'this';
|
||||
|
||||
#============
|
||||
package main;
|
||||
|
||||
ok defined(&Foo::has), 'Mo exports has';
|
||||
ok defined(&Foo::extends), 'Mo exports extends';
|
||||
ok not(defined(&Foo::new)), 'Mo does not export new';
|
||||
ok 'Foo'->isa('Mo::Object'), 'Foo isa Mo::Object';
|
||||
is "@Foo::ISA", "Mo::Object", '@Foo::ISA is Mo::Object';
|
||||
ok defined(&Foo::has), 'Lmo exports has';
|
||||
ok defined(&Foo::extends), 'Lmo exports extends';
|
||||
ok not(defined(&Foo::new)), 'Lmo does not export new';
|
||||
ok 'Foo'->isa('Lmo::Object'), 'Foo isa Lmo::Object';
|
||||
is "@Foo::ISA", "Lmo::Object", '@Foo::ISA is Lmo::Object';
|
||||
ok 'Foo'->can('new'), 'Foo can new';
|
||||
ok 'Foo'->can('this'), 'Foo can this';
|
||||
|
||||
@@ -50,7 +50,7 @@ ok not(defined($f->{this})), '{this} is not defined';
|
||||
|
||||
#============
|
||||
package Bar;
|
||||
use Mo 'builder', 'default';
|
||||
use Lmo 'builder', 'default';
|
||||
extends 'Foo';
|
||||
|
||||
has 'that';
|
||||
@@ -70,7 +70,7 @@ has guess => (
|
||||
#============
|
||||
package main;
|
||||
|
||||
ok 'Bar'->isa('Mo::Object'), 'Bar isa Mo::Object';
|
||||
ok 'Bar'->isa('Lmo::Object'), 'Bar isa Lmo::Object';
|
||||
ok 'Bar'->isa('Foo'), 'Bar isa Foo';
|
||||
is "@Bar::ISA", 'Foo', '@Bar::ISA is Foo';
|
||||
ok 'Bar'->can('new'), 'Bar can new';
|
||||
@@ -85,7 +85,7 @@ my $b = Bar->new(
|
||||
|
||||
is ref($b), 'Bar', 'Object created';
|
||||
ok $b->isa('Foo'), 'Inheritance works';
|
||||
ok $b->isa('Mo::Object'), 'Bar isa Mo::Object since Foo isa Mo::Object';
|
||||
ok $b->isa('Lmo::Object'), 'Bar isa Lmo::Object since Foo isa Lmo::Object';
|
||||
is $b->this, 'thing', 'Read works in parent class';
|
||||
is $b->that, 'thong', 'Read works in current class';
|
||||
is ref($b->them), 'ARRAY', 'default works';
|
||||
@@ -103,7 +103,7 @@ is $b->guess, 'me me me', 'default trumps builder';
|
||||
|
||||
#============
|
||||
package Baz;
|
||||
use Mo 'build';
|
||||
use Lmo 'build';
|
||||
|
||||
has 'foo';
|
||||
|
||||
@@ -114,7 +114,7 @@ sub BUILD {
|
||||
|
||||
#============
|
||||
package Maz;
|
||||
use Mo;
|
||||
use Lmo;
|
||||
extends 'Baz';
|
||||
|
||||
has 'bar';
|
28
t/lib/Lmo/unimport.t
Normal file
28
t/lib/Lmo/unimport.t
Normal file
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
BEGIN {
|
||||
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
|
||||
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
|
||||
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
|
||||
};
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
{
|
||||
package One; use Lmo;
|
||||
has one => (is => 'ro', default => sub { 'one' });
|
||||
no Lmo;
|
||||
}
|
||||
|
||||
my $unimported = One->new();
|
||||
is
|
||||
$unimported->one(),
|
||||
'one',
|
||||
"after unimporting, ->one still works";
|
||||
|
||||
ok !$unimported->can($_), "after unimpoirt, can't $_" for qw(has with extends);
|
||||
|
||||
done_testing;
|
28
t/lib/Lmo/unimport.t.moved
Normal file
28
t/lib/Lmo/unimport.t.moved
Normal file
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
BEGIN {
|
||||
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
|
||||
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
|
||||
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
|
||||
};
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
{
|
||||
package One; use Lmo;
|
||||
has one => (is => 'ro', default => sub { 'one' });
|
||||
no Lmo;
|
||||
}
|
||||
|
||||
my $unimported = One->new();
|
||||
is
|
||||
$unimported->one(),
|
||||
'one',
|
||||
"after unimporting, ->one still works";
|
||||
|
||||
ok !$unimported->can($_), "after unimpoirt, can't $_" for qw(has with extends);
|
||||
|
||||
done_testing;
|
@@ -10,8 +10,7 @@
|
||||
|
||||
# Query 1: 0 QPS, 0x concurrency, ID 0x5D51E5F01B88B79E at byte 0 ________
|
||||
# This item is included in the report because it matches --limit.
|
||||
# Scores: Apdex = 0.50 [1.0]*, V/M = 0.00
|
||||
# Query_time sparkline: | ^ |
|
||||
# Scores: V/M = 0.00
|
||||
# Time range: all events occurred at 2013-01-24 13:03:28.672987
|
||||
# Attribute pct total min max avg 95% stddev median
|
||||
# ============ === ======= ======= ======= ======= ======= ======= =======
|
||||
@@ -36,6 +35,6 @@
|
||||
administrator command: Connect\G
|
||||
|
||||
# Profile
|
||||
# Rank Query ID Response time Calls R/Call Apdx V/M Item
|
||||
# ==== ================== ============= ===== ====== ==== ===== ==========
|
||||
# 1 0x5D51E5F01B88B79E 3.5363 100.0% 1 3.5363 0.50 0.00 ADMIN CONNECT
|
||||
# Rank Query ID Response time Calls R/Call V/M Item
|
||||
# ==== ================== ============= ===== ====== ===== =============
|
||||
# 1 0x5D51E5F01B88B79E 3.5363 100.0% 1 3.5363 0.00 ADMIN CONNECT
|
||||
|
@@ -10,8 +10,7 @@
|
||||
|
||||
# Query 1: 0 QPS, 0x concurrency, ID 0x5D51E5F01B88B79E at byte 0 ________
|
||||
# This item is included in the report because it matches --limit.
|
||||
# Scores: Apdex = 0.50 [1.0]*, V/M = 0.00
|
||||
# Query_time sparkline: | ^ |
|
||||
# Scores: V/M = 0.00
|
||||
# Time range: all events occurred at 2013-01-22 09:55:57.793375
|
||||
# Attribute pct total min max avg 95% stddev median
|
||||
# ============ === ======= ======= ======= ======= ======= ======= =======
|
||||
@@ -35,6 +34,6 @@
|
||||
administrator command: Connect\G
|
||||
|
||||
# Profile
|
||||
# Rank Query ID Response time Calls R/Call Apdx V/M Item
|
||||
# ==== ================== ============= ===== ====== ==== ===== ==========
|
||||
# 1 0x5D51E5F01B88B79E 3.8195 100.0% 1 3.8195 0.50 0.00 ADMIN CONNECT
|
||||
# Rank Query ID Response time Calls R/Call V/M Item
|
||||
# ==== ================== ============= ===== ====== ===== =============
|
||||
# 1 0x5D51E5F01B88B79E 3.8195 100.0% 1 3.8195 0.00 ADMIN CONNECT
|
||||
|
Reference in New Issue
Block a user