summaryrefslogtreecommitdiff
path: root/lib/Moose/Exception/OverloadConflictInSummation.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Moose/Exception/OverloadConflictInSummation.pm')
-rw-r--r--lib/Moose/Exception/OverloadConflictInSummation.pm61
1 files changed, 61 insertions, 0 deletions
diff --git a/lib/Moose/Exception/OverloadConflictInSummation.pm b/lib/Moose/Exception/OverloadConflictInSummation.pm
new file mode 100644
index 0000000..0292326
--- /dev/null
+++ b/lib/Moose/Exception/OverloadConflictInSummation.pm
@@ -0,0 +1,61 @@
+package Moose::Exception::OverloadConflictInSummation;
+our $VERSION = '2.1405';
+
+use Moose;
+extends 'Moose::Exception';
+
+use Moose::Util 'find_meta';
+
+has 'role_application' => (
+ is => 'ro',
+ isa => 'Moose::Meta::Role::Application::RoleSummation',
+ required => 1
+);
+
+has 'role_names' => (
+ traits => ['Array'],
+ is => 'bare',
+ isa => 'ArrayRef[Str]',
+ handles => {
+ role_names => 'elements',
+ },
+ required => 1,
+ documentation =>
+ "This attribute is an ArrayRef containing role names, if you want metaobjects\n"
+ . "associated with these role names, then call method roles on the exception object.\n",
+);
+
+has 'overloaded_op' => (
+ is => 'ro',
+ isa => 'Str',
+ required => 1,
+);
+
+sub roles {
+ my $self = shift;
+ my @role_names = $self->role_names;
+ my @roles = map { find_meta($_) } @role_names;
+ return @roles;
+}
+
+sub _build_message {
+ my $self = shift;
+
+ my @roles = $self->role_names;
+ my $role_names = join "|", @roles;
+
+ my $op = $self->overloaded_op;
+ if ( $op eq 'fallback' ) {
+ return
+ 'We have encountered an overloading conflict for the fallback '
+ . 'during composition. This is a fatal error.';
+ }
+ else {
+ return
+ "Role '$role_names' has encountered an overloading conflict "
+ . "during composition. The two roles both overload the '$op' operator. "
+ . 'This is a fatal error.';
+ }
+}
+
+1;