Mouse::Exporter->setup_import_methods(
as_is => [qw(
- as where message from via
+ as where message optimize_as
+ from via
type subtype coerce class_type role_type enum
find_type_constraint
)],
my %TYPE;
-sub as ($) {
- return(as => $_[0]);
-}
-sub where (&) {
- return(where => $_[0])
-}
-sub message (&) {
- return(message => $_[0])
-}
+sub as ($) { (as => $_[0]) }
+sub where (&) { (where => $_[0]) }
+sub message (&) { (message => $_[0]) }
+sub optimize_as (&) { (optimize_as => $_[0]) }
sub from { @_ }
sub via (&) { $_[0] }
}
$args{name} = $name;
+ my $parent;
+ if($mode eq 'subtype'){
+ $parent = delete $args{as};
+ if(!$parent){
+ $parent = delete $args{name};
+ $name = '__ANON__';
+ }
+ }
my $package_defined_in = $args{package_defined_in} ||= caller(1);
. "$existing->{package_defined_in} and cannot be created again in $package_defined_in");
}
- $args{constraint} = delete($args{where}) if exists $args{where};
+ $args{constraint} = delete $args{where} if exists $args{where};
$args{optimized} = delete $args{optimized_as} if exists $args{optimized_as};
my $constraint;
if($mode eq 'subtype'){
- my $parent = delete($args{as})
- or confess('A subtype cannot consist solely of a name, it must have a parent');
-
$constraint = find_or_create_isa_type_constraint($parent)->create_child_type(%args);
}
else{
}
}
sub _find_or_create_union_type{
- my @types = map{ $_->{type_constraints} ? @{$_->{type_constraints}} : $_ } @_;
+ my @types = sort{ $a cmp $b } map{ $_->{type_constraints} ? @{$_->{type_constraints}} : $_ } @_;
- my $name = join '|', map{ $_->name } @types;
+ my $name = join '|', @types;
$TYPE{$name} ||= do{
return Mouse::Meta::TypeConstraint->new(
}
sub find_or_create_does_type_constraint{
- my $type = find_or_parse_type_constriant(@_) || role_type(@_);
-
- if($type->{type} && $type->{type} ne 'Role'){
- Carp::cluck("$type is not a role type");
- }
- return $type;
+ return find_or_parse_type_constraint(@_) || role_type(@_);
}
sub find_or_create_isa_type_constraint {