Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set sub names when calling defer_sub #6

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions lib/MooseX/Types.pm
Original file line number Diff line number Diff line change
Expand Up @@ -486,8 +486,8 @@ This generates a coercion handler function, e.g. C<to_Int($value)>.
=cut

sub coercion_export_generator {
my ($class, $type, $full, $undef_msg) = @_;
return defer_sub undef, sub {
my ($class, $sub_name, $type, $full, $undef_msg) = @_;
return defer_sub $sub_name, sub {
my ($value) = @_;

# we need a type object
Expand All @@ -511,9 +511,9 @@ Generates a constraint check closure, e.g. C<is_Int($value)>.
=cut

sub check_export_generator {
my ($class, $type, $full, $undef_msg) = @_;
my ($class, $sub_name, $type, $full, $undef_msg) = @_;

return defer_sub undef, sub {
return defer_sub $sub_name, sub {
my ($value) = @_;

# we need a type object
Expand Down
18 changes: 14 additions & 4 deletions lib/MooseX/Types/Base.pm
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,18 @@ sub import {
# determine the wrapper, -into is supported for compatibility reasons
my $wrapper = $options->{ -wrapper } || 'MooseX::Types';

$args[0]->{into} = $options->{ -into }
if exists $options->{ -into };
# It's a little gross to calculate the calling package here when
# Sub::Exporter is going to do it again, but we need to give Sub::Defer a
# fully qualified name if we give it a name at all, and we want to give it
# a name. Otherwise it guesses at the name and will use its caller, which
# in this case ends up being MooseX::Types, which is wrong.
my $into;
if (exists $options->{ -into }) {
$into = $args[0]->{into} = $options->{ -into }
}
else {
$into = caller(($options->{into_level} || 0) + 1)
}

my %ex_util;

Expand All @@ -79,7 +89,7 @@ sub import {
my $check_name = "is_${type_short}";
push @{ $ex_spec{exports} },
$check_name,
sub { $wrapper->check_export_generator($type_short, $type_full, $undef_msg) };
sub { $wrapper->check_export_generator("${into}::$check_name", $type_short, $type_full, $undef_msg) };

# only export coercion helper if full (for libraries) or coercion is defined
next TYPE
Expand All @@ -89,7 +99,7 @@ sub import {
my $coercion_name = "to_${type_short}";
push @{ $ex_spec{exports} },
$coercion_name,
sub { $wrapper->coercion_export_generator($type_short, $type_full, $undef_msg) };
sub { $wrapper->coercion_export_generator("${into}::$coercion_name", $type_short, $type_full, $undef_msg) };
$ex_util{ $type_short }{to}++; # shortcut to remember this exists
}

Expand Down
28 changes: 28 additions & 0 deletions t/27-sub-defer.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use strict;
use warnings;

use Test::More 0.88;
use if $ENV{AUTHOR_TESTING}, 'Test::Warnings';

use Test::Fatal;
use B::Deparse;
use MooseX::Types::Moose qw( Int );
use Sub::Defer qw( undefer_all );

like(
B::Deparse->new->coderef2text( \&is_Int ),
qr/package Sub::Defer/,
'is_Int sub has not yet been undeferred'
);
is(
exception { undefer_all() },
undef,
'Sub::Defer::undefer_all works with subs exported by MooseX::Types'
);
unlike(
B::Deparse->new->coderef2text( \&is_Int ),
qr/package Sub::Defer/,
'is_Int sub is now undeferred'
);

done_testing();