MooseX-Compile

 view release on metacpan or  search on metacpan

lib/MooseX/Compile/Compiler.pm  view on Meta::CPAN

    file    => __FILE__,
    version => $version,
);
REGISTER
}

sub pmc_preamble_header_hide_moose {
    my ( $self, %args ) = @_;

    my $hide = <<'#\'HIDE_MOOSE';
#\
# disable requiring and importing of Moose from this compile class
my ( $__mx_compile_prev_require, %__mx_compile_overridden_imports );

BEGIN {
    $__mx_compile_prev_require = defined &CORE::GLOBAL::require ? \&CORE::GLOBAL::require : undef;

    no warnings 'redefine';

    # FIXME move this to Bootstrap? Bootstrap->override_global_require( class => $$quoted_class$$ )?
    *CORE::GLOBAL::require = sub {
        my ( $faked_class ) = ( $_[0] =~ m/^ ( Moose | metaclass ) \.pm $/x );

        return 1 if caller() eq $$quoted_class$$ and $faked_class;

        my $hook;

        if ( $faked_class and not $INC{$_[0]} ) {
            # load Moose or metaclass in a clean env, and then wrap it's import()
            no strict 'refs';

            my $import = "${faked_class}::import";

            my $wrapper = \&$import;

            undef *$import; # clean out the symbol so it doesn't warn about redefining

            $hook = bless [sub {
                $__mx_compile_overridden_imports{$faked_class} = \&$import; # stash the real import
                *$import = $wrapper;
            }], "MooseX::Compile::Scope::Guard";
        }

        if ( $__mx_compile_prev_require ) {
            &$__mx_compile_prev_require;
        } else {
            require $_[0];
        }
    };

    foreach my $class qw(Moose metaclass) {
        no strict 'refs';

        my $import = "${class}::import";

        $__mx_compile_overridden_imports{$class} = defined &$import && \&$import;

        *$import = sub {
            if ( caller eq $$quoted_class$$ ) {
                if ( $class eq 'Moose' ) {
                    strict->import;
                    warnings->import;
                }

                return;
            }

            if ( my $sub = $__mx_compile_overridden_imports{\$class} ) {
                goto $sub;
            }

            return;
        };
    }
}
#'HIDE_MOOSE

    $hide =~ s/\$\$(\w+)\$\$/$args{$1}/ge;

    return $hide;
}

sub pmc_preamble_setup_env {
    my ( $self, %args ) = @_;

    my $class = $args{class};

    my $quoted_class = dump($class);

    my $decl = $self->pmc_preamble_class_def_for_begin(%args);

    return <<ENV;
# stub the sugar
BEGIN {
    package $class;

    my \$fake_meta = bless { name => $quoted_class }, "MooseX::Compile::MetaBlackHole";
    sub meta { \$fake_meta }

$decl

    our \$__mx_is_compiled = 1;
}
ENV
}

sub pmc_preamble_class_def_for_begin {
    my ( $self, %args ) = @_;

    join("\n\n", $self->compile_code_symbols( %args, symbol_categories => [qw(moose_sugar moose_exports)] ) );
}

sub pmc_preamble_at_end {
    my ( $self, %args ) = @_;
    my ( $class, $code ) = @args{qw(class code)};

    return <<HOOK
# try to approximate the time that Moose generated code enters the class
# this presumes you didn't stick the moose sugar in a BEGIN { } block
my \$__mx_compile_run_at_end = bless [ sub {



( run in 1.333 second using v1.01-cache-2.11-cpan-39bf76dae61 )