}
sub throw {
- my %args;
- if (@_ == 1) {
- $args{message} = shift;
- }
- else {
- %args = @_;
+ if (@_ % 2) {
+ unshift @_, 'message';
}
+ my %args = @_;
+
+ my $superclass = delete($args{superclass}) || 'Throwable::Error';
my $roles = delete($args{roles});
- my $metaclass = Moose::Meta::Class->create_anon_class(
- superclasses => ['Throwable::Error'],
- ($roles ? (roles => $roles) : ()),
- );
+ my $metaclass;
+
+ load_class($superclass);
+
+ if ($roles) {
+ $metaclass = Moose::Meta::Class->create_anon_class(
+ superclasses => [$superclass],
+ roles => $roles,
+ );
+ }
+ else {
+ $metaclass = Moose::Meta::Class->initialize($superclass);
+ }
$metaclass->name->throw(\%args);
}