first sketch of Devel::Declare code
[gitmo/MooseX-Antlers.git] / lib / MooseX / Antlers / DevelDeclareHandler.pm
CommitLineData
48972854 1package MooseX::Antlers::DevelDeclareHandler;
2
3use Method::Signatures::Simple ();
4use B::Compiling;
5use B::Hooks::EndOfScope;
6
7my %fix;
8my %names;
9
10my $orig_block = Devel::Declare::Context::Simple->can('inject_if_block');
11
12*Devel::Declare::Context::Simple::inject_if_block = sub {
13 $orig_block->(@_);
14 my $line = $_[0]->get_linestr;
15 $line =~ s/BEGIN {.*?};//;
16 push(@{$fix{PL_compiling->file}}, [ PL_compiling->line, $line ]);
17};
18
19my $orig_scope = Devel::Declare::Context::Simple->can('inject_scope');
20
21*Devel::Declare::Context::Simple::inject_scope = sub {
22 my $self = $_[0];
23 $orig_scope->(@_);
24 on_scope_end {
25 push(@{$fix{PL_compiling->file}}, [ PL_compiling->line, $self->get_linestr ]);
26 };
27};
28
29my $orig_install = Devel::Declare::MethodInstaller::Simple->can('install');
30
31*Devel::Declare::MethodInstaller::Simple::install = sub {
32 push(@{$names{PL_compiling->file}}, $_[1]);
33 $orig_install->(@_);
34};
35
36sub emit_result {
37 my ($file) = @_;
38 use IO::All qw(io);
39 my @self = io($file)->getlines;
40 my @methods = @{$names{$file}};
41 my $method_section = q!
42use Sub::Name ();
43my ($meth, @methods);
44BEGIN {
45 my @methods = qw(!.join(' ', @methods).q!);
46 $meth = sub (&) {
47 my $name = shift(@methods);
48 *$name = Sub::Name::subname $name => $_[0];
49 };
50}
51use MooseX::Antlers::StealImport
52 'Method::Signatures::Simple' => {
53 method => $meth
54 };
55!;
56 foreach my $f (@{$fix{$file}}) {
57 my ($line, $linestr) = @$f;
58 $self[$line-1] = $linestr;
59 }
60 return join("", $method_section, @self);
61}
62
631;