יובל קוג'מן (Yuval Kogman) > MooseX-Compile > MooseX::Compile

Download:
MooseX-Compile-0.01.tar.gz

Dependencies

Annotate this POD

CPAN RT

New  2
Open  1
View/Report Bugs
Source  

NAME ^

MooseX::Compile - Moose.pmc

SYNOPSIS ^

In MyClass.pm:

    package MyClass;
    use Moose;

    # your moose class here

On the command line:

    $ mkcompile compile --make-immutable MyClass

Or to always compile:

    use MooseX::Compile; # instead of use Moose

HERE BE DRAGONS ^

This is alpha code.

If you decide to to use it please come by the #moose IRC channel on irc.perl.org (maybe this link works: irc://irc.perl.org/#moose).

Your help in testing this is highly valued, so please feel free to verbally abuse nothingmuch in #moose until things are working properly.

DESCRIPTION ^

The example in the "SYNOPSIS" will compile MyClass into two files, MyClass.pmc and MyClass.mopc. The .pmc file caches all of the generated code, and the .mopc file is a Storable file of the metaclass instance.

When MyClass is loaded the next time, Perl will see the .pmc file and load that instead. This file will load faster for several reasons:

If all your classes are compiled and you don't use introspection in your code, you can then deploy your code without using moose.

MODUS OPERANDI ^

This is not a source filter.

Due to the fragility of source filtering in Perl, MooseX::Compile::Compiler will not alter the body of the class, but instead prefix it with a preamble that sets up the right environment for it.

This involves temporarily overriding CORE::GLOBAL::require to hide Moose from this module (but not others), and stubbing the sugar with no-ops (the various declarations are thus effectively stripped without altering the source code), amongst other things.

Then the source code of the original class is executed normally, and when the file's lexical scope gets cleaned up then the final pieces of the class are put in place and all the trickery is undone.

Until this point meta is replaced with a mock object that will silently or loudly ignore various method calls depending on their nature. For instance

    __PACKAGE__->meta->make_immutable();

is a silent no-op, because when the compiler compiled it the class was already immutable, so the loaded version will be immutable too.

On the other hand

    __PACKAGE__->meta->superclasses(qw(Foo));

will complain because the value of @ISA is already captured, and changing it is meaningless.

INTERFACE FOR COMPILED MODULES ^

$__mx_is_compiled

This variable is set at BEGIN for modules in a .pmc. This allows you to write conditional code, like:

    use if not(our $__mx_is_compiled) metaclass => "Blah";

    __PACKAGE__->meta->add_attribute( ... ) unless our $__mx_is_compiled;
__mx_compile_post_hook

If you add a subroutine named __mx_compile_post_hook to your class it will be called at the end of compilation, allowing you to to diddle the class after loading.

LIMITATIONS ^

This developer release comes with some serious limitations.

It has so far only been tested with the Point and Point3D classes from the recipe.

This means:

TODO ^

There is a fairly long TODO file in the distribution.

SEE ALSO ^

MooseX::Compile::Compiler, MooseX::Compile::Bootstrap, MooseX::Compile::CLI.

VERSION CONTROL ^

http://code2.0beta.co.uk/moose/svn/MooseX-Compile/trunk

AUTHOR ^

Yuval Kogman <nothingmuch@woobling.org>

COPYRIGHT ^

    Copyright (c) 2008 Infinity Interactive, Yuval Kogman. All rights reserved
    This program is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.
syntax highlighting: