Simplify test code a bit
[gitmo/MooseX-Compiler.git] / lib / MooseX / Compiler.pm
CommitLineData
9e60f0d8 1package MooseX::Compiler;
2
3use strict;
4use warnings;
5
6use Module::Runtime qw( module_notional_filename );
7use PPI::Document;
8use Scalar::Util qw( blessed );
9
10use Moose;
11use Moose::Util::TypeConstraints;
12
13my $moose_class = subtype, as 'ClassName', where {
14 $_[0]->can('meta')
15 && blessed $_[0]->meta()
16 && $_[0]->meta()->isa('Moose::Meta::Class');
17};
18
19has class => (
20 is => 'ro',
21 isa => $moose_class,
22 required => 1,
23);
24
25has _class_meta => (
26 is => 'ro',
27 isa => 'Moose::Meta::Class',
28 init_arg => undef,
29 lazy => 1,
30 default => sub { $_[0]->class()->meta() },
31);
32
33sub compile_class {
34 my $self = shift;
35
36 my $code
37 = join q{},
38 $self->_adjusted_class_content(),
39 $self->_adjusted_role_content(),
40 $self->_inlined_attribute_code();
41
42 return $code;
43}
44
45sub _adjusted_class_content {
46 my $self = shift;
47
48 my $pm_file = module_notional_filename( $self->class() );
49 my $path_to_class = $INC{$pm_file}
50 or die "Cannot find $pm_file in %INC!";
51
52 my $doc = PPI::Document->new( $path_to_class->stringify() )
53 or die PPI::Document->errstr();
54
55 my $use_nodes = $doc->find(
56 sub {
57 my $node = $_[1];
58 return undef
59 if $node->isa('PPI::Statement')
60 && !$node->isa('PPI::Statement::Include');
61 return undef if $node->isa('PPI::Structure');
62 return 1
63 if $node->isa('PPI::Statement::Include')
64 && $node->module() =~ /^Moose/;
65 return 0;
66 }
67 );
68
69 for my $node ( @{$use_nodes} ) {
70 my $replacement_code .=
71 defined $node->module_version()
72 ? join(
73 q{ },
74 'use', $node->module(), $node->module_version(), '()', ';',
75 )
76 : '# ' . $node->content();
77
78 $node->insert_before( $_->clone() )
79 for PPI::Document->new( \$replacement_code )->children();
80 $node->remove();
81 }
82
83 return $doc->content();
84}
85
86sub _adjusted_role_content {
87 return q{};
88}
89
90sub _inlined_attribute_code {
91 return q{};
92}
93
94__PACKAGE__->meta()->make_immutable();
95
961;