has foo => ( is => "ro" );
- package Baz::Error;
- use Moose;
-
- has message => ( isa => "Str", is => "ro" );
- has attr => ( isa => "Moose::Meta::Attribute", is => "ro" );
- has method => ( isa => "Moose::Meta::Method", is => "ro" );
- has metaclass => ( isa => "Moose::Meta::Class", is => "ro" );
- has data => ( is => "ro" );
- has line => ( isa => "Int", is => "ro" );
- has file => ( isa => "Str", is => "ro" );
- has last_error => ( isa => "Any", is => "ro" );
+ BEGIN {
+ package Baz::Error;
+ use Moose;
+ extends 'Moose::Object', 'Moose::Error::Default';
+
+ has message => ( isa => "Str", is => "ro" );
+ has attr => ( isa => "Moose::Meta::Attribute", is => "ro" );
+ has method => ( isa => "Moose::Meta::Method", is => "ro" );
+ has metaclass => ( isa => "Moose::Meta::Class", is => "ro" );
+ has data => ( is => "ro" );
+ has line => ( isa => "Int", is => "ro" );
+ has file => ( isa => "Str", is => "ro" );
+ has last_error => ( isa => "Any", is => "ro" );
+ }
package Baz;
use metaclass (
use Moose;
extends 'Baz';
- Moose::Util::MetaRole::apply_metaclass_roles(
- for_class => __PACKAGE__,
- metaclass_roles => ['Role::Foo'],
+ Moose::Util::MetaRole::apply_metaroles(
+ for => __PACKAGE__,
+ class_metaroles => { class => ['Role::Foo'] },
);
}
use Moose;
- Moose::Util::MetaRole::apply_metaclass_roles(
- for_class => __PACKAGE__,
- metaclass_roles => ['Role::Foo'],
+ Moose::Util::MetaRole::apply_metaroles(
+ for => __PACKAGE__,
+ class_metaroles => { class => ['Role::Foo'] },
);
}
::lives_ok { extends 'Foo::Sub' } 'error_class differs by role so incompat is handled';
- Moose::Util::MetaRole::apply_metaclass_roles(
- for_class => __PACKAGE__,
- error_class_roles => ['Role::Foo'],
+ Moose::Util::MetaRole::apply_metaroles(
+ for => __PACKAGE__,
+ class_metaroles => { error => ['Role::Foo'] },
);
}
ok( Foo::Sub::Sub->meta->error_class->isa('Moose::Error::Croak'),
q{Foo::Sub::Sub's error_class now subclasses Moose::Error::Croak} );
+{
+ package Quux::Default;
+ use Moose;
+
+ has foo => (is => 'ro');
+ sub bar { shift->foo(1) }
+}
+
+{
+ package Quux::Croak;
+ use metaclass 'Moose::Meta::Class', error_class => 'Moose::Error::Croak';
+ use Moose;
+
+ has foo => (is => 'ro');
+ sub bar { shift->foo(1) }
+}
+
+{
+ package Quux::Confess;
+ use metaclass 'Moose::Meta::Class', error_class => 'Moose::Error::Confess';
+ use Moose;
+
+ has foo => (is => 'ro');
+ sub bar { shift->foo(1) }
+}
+
+sub stacktrace_ok (&) {
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+ my $code = shift;
+ eval { $code->() };
+ my @lines = split /\n/, $@;
+ cmp_ok(scalar(@lines), '>', 1, "got a stacktrace");
+}
+
+sub stacktrace_not_ok (&) {
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+ my $code = shift;
+ eval { $code->() };
+ my @lines = split /\n/, $@;
+ cmp_ok(scalar(@lines), '==', 1, "didn't get a stacktrace");
+}
+
+my $default = Quux::Default->new;
+my $croak = Quux::Croak->new;
+my $confess = Quux::Confess->new;
+
+is($default->meta->error_class, 'Moose::Error::Default');
+is($croak->meta->error_class, 'Moose::Error::Croak');
+is($confess->meta->error_class, 'Moose::Error::Confess');
+
+{
+ local $ENV{MOOSE_ERROR_STYLE};
+ stacktrace_ok { $default->bar };
+ stacktrace_not_ok { $croak->bar };
+ stacktrace_ok { $confess->bar };
+}
+
+{
+ local $ENV{MOOSE_ERROR_STYLE} = 'croak';
+ stacktrace_not_ok { $default->bar };
+ stacktrace_not_ok { $croak->bar };
+ stacktrace_ok { $confess->bar };
+}
+
+{
+ local $ENV{MOOSE_ERROR_STYLE} = 'confess';
+ stacktrace_ok { $default->bar };
+ stacktrace_not_ok { $croak->bar };
+ stacktrace_ok { $confess->bar };
+}
+
done_testing;