| Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Type/Tiny/Duck.pm |
| Statements | Executed 81 statements in 1.01ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 31µs | 31µs | Type::Tiny::Duck::BEGIN@3 |
| 4 | 1 | 1 | 19µs | 24µs | Type::Tiny::Duck::__ANON__[:104] |
| 1 | 1 | 1 | 13µs | 91µs | Type::Tiny::Duck::new |
| 1 | 1 | 1 | 10µs | 15µs | Type::Tiny::Duck::BEGIN@19 |
| 14 | 3 | 1 | 9µs | 9µs | Type::Tiny::Duck::_is_null_constraint |
| 1 | 1 | 1 | 7µs | 10µs | Type::Tiny::Duck::BEGIN@4 |
| 4 | 1 | 1 | 7µs | 12µs | Type::Tiny::Duck::inlined |
| 1 | 1 | 1 | 6µs | 31µs | Type::Tiny::Duck::BEGIN@5 |
| 1 | 1 | 1 | 5µs | 34µs | Type::Tiny::Duck::BEGIN@14 |
| 4 | 1 | 1 | 5µs | 5µs | Type::Tiny::Duck::CORE:match (opcode) |
| 1 | 1 | 1 | 5µs | 5µs | Type::Tiny::Duck::_build_inlined |
| 1 | 1 | 1 | 3µs | 3µs | Type::Tiny::Duck::BEGIN@7 |
| 1 | 1 | 1 | 2µs | 2µs | Type::Tiny::Duck::BEGIN@20 |
| 9 | 1 | 1 | 1µs | 1µs | Type::Tiny::Duck::has_inlined |
| 0 | 0 | 0 | 0s | 0s | Type::Tiny::Duck::__ANON__[:166] |
| 0 | 0 | 0 | 0s | 0s | Type::Tiny::Duck::__ANON__[:74] |
| 0 | 0 | 0 | 0s | 0s | Type::Tiny::Duck::_build_constraint |
| 0 | 0 | 0 | 0s | 0s | Type::Tiny::Duck::_croak |
| 0 | 0 | 0 | 0s | 0s | Type::Tiny::Duck::_exporter_fail |
| 0 | 0 | 0 | 0s | 0s | Type::Tiny::Duck::_instantiate_moose_type |
| 0 | 0 | 0 | 0s | 0s | Type::Tiny::Duck::_short_name |
| 1 | 1 | 1 | 0s | 0s | Type::Tiny::Duck::methods |
| 0 | 0 | 0 | 0s | 0s | Type::Tiny::Duck::validate_explain |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Type::Tiny::Duck; | ||||
| 2 | |||||
| 3 | 2 | 42µs | 1 | 31µs | # spent 31µs within Type::Tiny::Duck::BEGIN@3 which was called:
# once (31µs+0s) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 3 # spent 31µs making 1 call to Type::Tiny::Duck::BEGIN@3 |
| 4 | 2 | 21µs | 2 | 13µs | # spent 10µs (7+3) within Type::Tiny::Duck::BEGIN@4 which was called:
# once (7µs+3µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 4 # spent 10µs making 1 call to Type::Tiny::Duck::BEGIN@4
# spent 3µs making 1 call to strict::import |
| 5 | 2 | 34µs | 2 | 56µs | # spent 31µs (6+25) within Type::Tiny::Duck::BEGIN@5 which was called:
# once (6µs+25µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 5 # spent 31µs making 1 call to Type::Tiny::Duck::BEGIN@5
# spent 25µs making 1 call to warnings::import |
| 6 | |||||
| 7 | # spent 3µs within Type::Tiny::Duck::BEGIN@7 which was called:
# once (3µs+0s) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 10 | ||||
| 8 | 1 | 0s | $Type::Tiny::Duck::AUTHORITY = 'cpan:TOBYINK'; | ||
| 9 | 1 | 3µs | $Type::Tiny::Duck::VERSION = '2.000001'; | ||
| 10 | 1 | 29µs | 1 | 3µs | } # spent 3µs making 1 call to Type::Tiny::Duck::BEGIN@7 |
| 11 | |||||
| 12 | 1 | 1µs | $Type::Tiny::Duck::VERSION =~ tr/_//d; | ||
| 13 | |||||
| 14 | 2 | 52µs | 2 | 63µs | # spent 34µs (5+29) within Type::Tiny::Duck::BEGIN@14 which was called:
# once (5µs+29µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 14 # spent 34µs making 1 call to Type::Tiny::Duck::BEGIN@14
# spent 29µs making 1 call to Exporter::import |
| 15 | |||||
| 16 | sub _croak ($;@) { require Error::TypeTiny; goto \&Error::TypeTiny::croak } | ||||
| 17 | |||||
| 18 | |||||
| 19 | 3 | 25µs | 2 | 20µs | # spent 15µs (10+5) within Type::Tiny::Duck::BEGIN@19 which was called:
# once (10µs+5µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 19 # spent 15µs making 1 call to Type::Tiny::Duck::BEGIN@19
# spent 5µs making 1 call to UNIVERSAL::VERSION |
| 20 | 2 | 707µs | 1 | 2µs | # spent 2µs within Type::Tiny::Duck::BEGIN@20 which was called:
# once (2µs+0s) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 20 # spent 2µs making 1 call to Type::Tiny::Duck::BEGIN@20 |
| 21 | 1 | 13µs | our @ISA = qw( Type::Tiny::ConstrainedObject Exporter::Tiny ); | ||
| 22 | |||||
| 23 | sub _short_name { 'Duck' } | ||||
| 24 | |||||
| 25 | sub _exporter_fail { | ||||
| 26 | my ( $class, $type_name, $methods, $globals ) = @_; | ||||
| 27 | my $caller = $globals->{into}; | ||||
| 28 | my $type = $class->new( | ||||
| 29 | name => $type_name, | ||||
| 30 | methods => [ @$methods ], | ||||
| 31 | ); | ||||
| 32 | $INC{'Type/Registry.pm'} | ||||
| 33 | ? 'Type::Registry'->for_class( $caller )->add_type( $type, $type_name ) | ||||
| 34 | : ( $Type::Registry::DELAYED{$caller}{$type_name} = $type ) | ||||
| 35 | unless( ref($caller) or $caller eq '-lexical' or $globals->{'lexical'} ); | ||||
| 36 | return map +( $_->{name} => $_->{code} ), @{ $type->exportables }; | ||||
| 37 | } | ||||
| 38 | |||||
| 39 | # spent 91µs (13+78) within Type::Tiny::Duck::new which was called:
# once (13µs+78µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 1028 of Types/Standard.pm | ||||
| 40 | 1 | 1µs | my $proto = shift; | ||
| 41 | |||||
| 42 | 1 | 1µs | my %opts = ( @_ == 1 ) ? %{ $_[0] } : @_; | ||
| 43 | 1 | 0s | _croak "Need to supply list of methods" unless exists $opts{methods}; | ||
| 44 | |||||
| 45 | 1 | 0s | $opts{methods} = [ $opts{methods} ] unless ref $opts{methods}; | ||
| 46 | |||||
| 47 | 1 | 3µs | 1 | 1µs | if ( Type::Tiny::_USE_XS ) { # spent 1µs making 1 call to Type::Tiny::__ANON__[Type/Tiny.pm:55] |
| 48 | my $methods = join ",", sort( @{ $opts{methods} } ); | ||||
| 49 | my $xsub = Type::Tiny::XS::get_coderef_for( "HasMethods[$methods]" ); | ||||
| 50 | $opts{compiled_type_constraint} = $xsub if $xsub; | ||||
| 51 | } | ||||
| 52 | elsif ( Type::Tiny::_USE_MOUSE ) { | ||||
| 53 | require Mouse::Util::TypeConstraints; | ||||
| 54 | my $maker = "Mouse::Util::TypeConstraints"->can( "generate_can_predicate_for" ); | ||||
| 55 | $opts{compiled_type_constraint} = $maker->( $opts{methods} ) if $maker; | ||||
| 56 | } | ||||
| 57 | |||||
| 58 | 1 | 5µs | 1 | 77µs | return $proto->SUPER::new( %opts ); # spent 77µs making 1 call to Type::Tiny::ConstrainedObject::new |
| 59 | } #/ sub new | ||||
| 60 | |||||
| 61 | 1 | 2µs | # spent 0s within Type::Tiny::Duck::methods which was called:
# once (0s+0s) by Type::Tiny::Duck::_build_inlined at line 79 | ||
| 62 | 4 | 9µs | 1 | 5µs | # spent 12µs (7+5) within Type::Tiny::Duck::inlined which was called 4 times, avg 3µs/call:
# 4 times (7µs+5µs) by Type::Tiny::inline_check at line 895 of Type/Tiny.pm, avg 3µs/call # spent 5µs making 1 call to Type::Tiny::Duck::_build_inlined |
| 63 | |||||
| 64 | 9 | 9µs | # spent 1µs within Type::Tiny::Duck::has_inlined which was called 9 times, avg 111ns/call:
# 9 times (1µs+0s) by Type::Tiny::can_be_inlined at line 881 of Type/Tiny.pm, avg 111ns/call | ||
| 65 | |||||
| 66 | 14 | 16µs | # spent 9µs within Type::Tiny::Duck::_is_null_constraint which was called 14 times, avg 643ns/call:
# 9 times (7µs+0s) by Type::Tiny::can_be_inlined at line 877 of Type/Tiny.pm, avg 778ns/call
# 4 times (2µs+0s) by Type::Tiny::inline_check at line 889 of Type/Tiny.pm, avg 500ns/call
# once (0s+0s) by Type::Tiny::_build_compiled_check at line 532 of Type/Tiny.pm | ||
| 67 | |||||
| 68 | sub _build_constraint { | ||||
| 69 | my $self = shift; | ||||
| 70 | my @methods = @{ $self->methods }; | ||||
| 71 | return sub { | ||||
| 72 | blessed( $_[0] ) | ||||
| 73 | and not grep( !$_[0]->can( $_ ), @methods ); | ||||
| 74 | }; | ||||
| 75 | } | ||||
| 76 | |||||
| 77 | # spent 5µs within Type::Tiny::Duck::_build_inlined which was called:
# once (5µs+0s) by Type::Tiny::Duck::inlined at line 62 | ||||
| 78 | 1 | 0s | my $self = shift; | ||
| 79 | 1 | 1µs | 1 | 0s | my @methods = @{ $self->methods }; # spent 0s making 1 call to Type::Tiny::Duck::methods |
| 80 | |||||
| 81 | 1 | 0s | my $xsub; | ||
| 82 | if ( Type::Tiny::_USE_XS ) { | ||||
| 83 | my $methods = join ",", sort( @{ $self->methods } ); | ||||
| 84 | $xsub = Type::Tiny::XS::get_subname_for( "HasMethods[$methods]" ); | ||||
| 85 | } | ||||
| 86 | |||||
| 87 | # spent 24µs (19+5) within Type::Tiny::Duck::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Type/Tiny/Duck.pm:104] which was called 4 times, avg 6µs/call:
# 4 times (19µs+5µs) by Type::Tiny::inline_check at line 895 of Type/Tiny.pm, avg 6µs/call | ||||
| 88 | 4 | 1µs | my $var = $_[1]; | ||
| 89 | 4 | 2µs | local $" = q{ }; | ||
| 90 | |||||
| 91 | # If $var is $_ or $_->{foo} or $foo{$_} or somesuch, then we | ||||
| 92 | # can't use it within the grep expression, so we need to save | ||||
| 93 | # it into a temporary variable ($tmp). | ||||
| 94 | 4 | 17µs | 4 | 5µs | my $code = # spent 5µs making 4 calls to Type::Tiny::Duck::CORE:match, avg 1µs/call |
| 95 | ( $var =~ /\$_/ ) | ||||
| 96 | ? qq{ Scalar::Util::blessed($var) and not do { my \$tmp = $var; grep(!\$tmp->can(\$_), qw/@methods/) } } | ||||
| 97 | : qq{ Scalar::Util::blessed($var) and not grep(!$var->can(\$_), qw/@methods/) }; | ||||
| 98 | |||||
| 99 | 4 | 3µs | return qq{do { $Type::Tiny::SafePackage use Scalar::Util (); $code }} | ||
| 100 | if $Type::Tiny::AvoidCallbacks; | ||||
| 101 | 4 | 0s | return "$xsub\($var\)" | ||
| 102 | if $xsub; | ||||
| 103 | 4 | 5µs | $code; | ||
| 104 | 1 | 3µs | }; | ||
| 105 | } #/ sub _build_inlined | ||||
| 106 | |||||
| 107 | sub _instantiate_moose_type { | ||||
| 108 | my $self = shift; | ||||
| 109 | my %opts = @_; | ||||
| 110 | delete $opts{parent}; | ||||
| 111 | delete $opts{constraint}; | ||||
| 112 | delete $opts{inlined}; | ||||
| 113 | |||||
| 114 | require Moose::Meta::TypeConstraint::DuckType; | ||||
| 115 | return "Moose::Meta::TypeConstraint::DuckType" | ||||
| 116 | ->new( %opts, methods => $self->methods ); | ||||
| 117 | } #/ sub _instantiate_moose_type | ||||
| 118 | |||||
| 119 | sub validate_explain { | ||||
| 120 | my $self = shift; | ||||
| 121 | my ( $value, $varname ) = @_; | ||||
| 122 | $varname = '$_' unless defined $varname; | ||||
| 123 | |||||
| 124 | return undef if $self->check( $value ); | ||||
| 125 | return ["Not a blessed reference"] unless blessed( $value ); | ||||
| 126 | |||||
| 127 | require Type::Utils; | ||||
| 128 | return [ | ||||
| 129 | sprintf( | ||||
| 130 | '"%s" requires that the reference can %s', | ||||
| 131 | $self, | ||||
| 132 | Type::Utils::english_list( map qq["$_"], @{ $self->methods } ), | ||||
| 133 | ), | ||||
| 134 | map sprintf( 'The reference cannot "%s"', $_ ), | ||||
| 135 | grep !$value->can( $_ ), | ||||
| 136 | @{ $self->methods } | ||||
| 137 | ]; | ||||
| 138 | } #/ sub validate_explain | ||||
| 139 | |||||
| 140 | push @Type::Tiny::CMP, sub { | ||||
| 141 | my $A = shift->find_constraining_type; | ||||
| 142 | my $B = shift->find_constraining_type; | ||||
| 143 | return Type::Tiny::CMP_UNKNOWN | ||||
| 144 | unless $A->isa( __PACKAGE__ ) && $B->isa( __PACKAGE__ ); | ||||
| 145 | |||||
| 146 | my %seen; | ||||
| 147 | for my $word ( @{ $A->methods } ) { | ||||
| 148 | $seen{$word} += 1; | ||||
| 149 | } | ||||
| 150 | for my $word ( @{ $B->methods } ) { | ||||
| 151 | $seen{$word} += 2; | ||||
| 152 | } | ||||
| 153 | |||||
| 154 | my $values = join( '', CORE::values %seen ); | ||||
| 155 | if ( $values =~ /^3*$/ ) { | ||||
| 156 | return Type::Tiny::CMP_EQUIVALENT; | ||||
| 157 | } | ||||
| 158 | elsif ( $values !~ /2/ ) { | ||||
| 159 | return Type::Tiny::CMP_SUBTYPE; | ||||
| 160 | } | ||||
| 161 | elsif ( $values !~ /1/ ) { | ||||
| 162 | return Type::Tiny::CMP_SUPERTYPE; | ||||
| 163 | } | ||||
| 164 | |||||
| 165 | return Type::Tiny::CMP_UNKNOWN; | ||||
| 166 | 1 | 2µs | }; | ||
| 167 | |||||
| 168 | 1 | 4µs | 1; | ||
| 169 | |||||
| 170 | __END__ | ||||
# spent 5µs within Type::Tiny::Duck::CORE:match which was called 4 times, avg 1µs/call:
# 4 times (5µs+0s) by Type::Tiny::Duck::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Type/Tiny/Duck.pm:104] at line 94, avg 1µs/call |