3 use Test::More tests => 20;
5 # This test script is derived from a MooseX::Method::Signatures test,
6 # which is sensitive to some details of Devel::Declare behaviour that
7 # ctx-simple.t is not. In particular, the use of a paren immediately
8 # following the declarator, constructing a parenthesised function call,
9 # invokes a different parser path.
11 use Devel::Declare ();
12 use Devel::Declare::Context::Simple ();
13 use B::Hooks::EndOfScope qw(on_scope_end);
15 sub inject_after_scope($) {
18 my $line = Devel::Declare::get_linestr();
19 return unless defined $line;
20 my $offset = Devel::Declare::get_linestr_offset();
21 substr($line, $offset, 0) = $inject;
22 Devel::Declare::set_linestr($line);
26 sub mtfnpy_parser(@) {
27 my $ctx = Devel::Declare::Context::Simple->new(into => __PACKAGE__);
29 $ctx->skip_declarator;
30 my $name = $ctx->strip_name;
31 die "No name\n" unless defined $name;
32 my $proto = $ctx->strip_proto;
33 die "Wrong declarator\n" unless $ctx->declarator eq "mtfnpy";
35 $ctx->inject_if_block(qq[BEGIN { @{[__PACKAGE__]}::inject_after_scope(', q[${name}]);') } unshift \@_, "${proto}";], "(sub ");
36 my $compile_stash = $ctx->get_curstash_name;
38 my ($code, $name, @args) = @_;
40 *{"${compile_stash}::${name}"} = $code;
45 Devel::Declare->setup_for(__PACKAGE__, {
46 mtfnpy => { const => \&mtfnpy_parser },
75 is $_[0], "ex\ntra extra extra";
87 is $_[0], "ex\ntra\nextra";