use Sub::Name 'subname';
use Carp 'confess';
-use Scalar::Util 'blessed';
+use Scalar::Util qw(blessed refaddr);
our $VERSION = '0.12';
our $AUTHORITY = 'cpan:STEVAN';
predicate => 'has_hand_optimized_type_constraint',
));
+sub parents {
+ my $self;
+ $self->parent;
+}
+
# private accessors
__PACKAGE__->meta->add_attribute('compiled_type_constraint' => (
sub equals {
my ( $self, $type_or_name ) = @_;
- my $type = Moose::Util::TypeConstraints::find_type_constraint($type_or_name);
+ my $other = Moose::Util::TypeConstraints::find_type_constraint($type_or_name);
+
+ return 1 if refaddr($self) == refaddr($other);
+
+ if ( $self->has_hand_optimized_type_constraint and $other->has_hand_optimized_type_constraint ) {
+ return 1 if $self->hand_optimized_type_constraint == $other->hand_optimized_type_constraint;
+ }
+
+ return unless $self->constraint == $other->constraint;
+
+ if ( $self->has_parent ) {
+ return unless $other->has_parent;
+ return unless $self->parent->equals( $other->parent );
+ } else {
+ return if $other->has_parent;
+ }
- $self->name eq $type->name;
+ return 1;
}
sub is_a_type_of {