1 package MooseX::Compiler;
6 use Module::Runtime qw( module_notional_filename );
8 use Scalar::Util qw( blessed );
11 use Moose::Util::TypeConstraints;
13 my $moose_class = subtype, as 'ClassName', where {
15 && blessed $_[0]->meta()
16 && $_[0]->meta()->isa('Moose::Meta::Class');
27 isa => 'Moose::Meta::Class',
30 default => sub { $_[0]->class()->meta() },
38 $self->_adjusted_class_content(),
39 $self->_adjusted_role_content(),
40 $self->_inlined_attribute_code();
45 sub _adjusted_class_content {
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!";
52 my $doc = PPI::Document->new( $path_to_class->stringify() )
53 or die PPI::Document->errstr();
55 my $use_nodes = $doc->find(
59 if $node->isa('PPI::Statement')
60 && !$node->isa('PPI::Statement::Include');
61 return undef if $node->isa('PPI::Structure');
63 if $node->isa('PPI::Statement::Include')
64 && $node->module() =~ /^Moose/;
69 for my $node ( @{$use_nodes} ) {
70 my $replacement_code .=
71 defined $node->module_version()
74 'use', $node->module(), $node->module_version(), '()', ';',
76 : '# ' . $node->content();
78 $node->insert_before( $_->clone() )
79 for PPI::Document->new( \$replacement_code )->children();
83 return $doc->content();
86 sub _adjusted_role_content {
90 sub _inlined_attribute_code {
94 __PACKAGE__->meta()->make_immutable();