Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Pull request Compare This branch is 1 commit ahead of robertkrimen:master.
Fetching latest commit...
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


    MooseX::Scaffold - Template metaprogramming with Moose

    Version 0.05

        package MyScaffolder;

        use MooseX::Scaffold;


        sub SCAFFOLD {
            my $class = shift; my %given = @_;

            $class->has($given{kind} => is => 'ro', isa => 'Int', required => 1);

            # Using MooseX::ClassAttribute
            $class->class_has(kind => is => 'ro', isa => 'Str', default => $given{kind});

        package MyAppleClass;

        use Moose;
        use MooseX::ClassAttribute;
        use MyScaffolder kind => 'apple';

        package MyBananaClass;

        use Moose;
        use MooseX::ClassAttribute;
        use MyScaffolder kind => 'banana';

        # ... meanwhile, back at the Batcave ...

        use MyAppleClass;
        use MyBananaClass;

        my $apple = MyAppleClass->new(apple => 1);
        my $banana = MyBananaClass->new(banana => 2);

    MooseX::Scaffold is a tool for creating or augmenting Moose classes

    Scaffolding can be triggered when a "use" is executed (any import
    arguments are passed to the scaffold subroutine) or you can explicitly
    call MooseX::Scaffold->scaffold with the scaffolding subroutine and the
    package name for the class.

    Depending on what you're trying to do, MooseX::Scaffold can behave in
    three different ways (Assume My::Class is the class you're trying to

        load_and_scaffold (scaffold)   - Attempt to require My::Class from My/ or do Moose::Meta::Class->create('My::Class')
                                         to make the package on-the-fly. Scaffold the result.

        load_or_scaffold (load)        - Attempt to require My::Class from My/ and stop if that works. If no My/ is
                                         found in @INC, then make a Moose class on-the-fly and scaffold it.
                                         This option can be used to create a default class if one isn't found.

        scaffold_without_load          - Don't attempt to require My::Class, just create it on-the-fly and scaffold it.

  MooseX::Scaffold->scaffold( ... )
    Scaffold a class by either loading it or creating it. You can pass
    through the following:

        scaffolding_package     This should be either a subroutine (sub { ... }) or a package name. If a package name
                                is given, then the package should contain a subroutine called SCAFFOLD

        class_package           The package name of resulting class

        load_or_scaffold        Attempt to load $class_package first and do nothing successful. Otherwise create
                                $class_package and scaffold it

        scaffold_without_load   Scaffold $class_package without attempting to load it first. Does not have
                                any effect if $class_package has been loaded already

        no_class_attribute      Set this to 1 to disable applying the MooseX::ClassAttribute meta-role
                                on class creation. This has no effect if the class is loaded (If you
                                want class_has with a loaded class, make sure to 'use MooseX::ClassAttribute')

  MooseX::Scaffold->load_and_scaffold( ... )
    An alias for ->scaffold

  MooseX::Scaffold->load_or_scaffold( ... )
    An alias for ->scaffold with "load_or_scaffold" set to 1

  MooseX::Scaffold->load( ... )
    An alias for ->load_or_scaffold

  MooseX::Scaffold->scaffold_without_load( ... )
    An alias for ->scaffold with "scaffold_without_load" set to 1

  MooseX::Scaffold->build_scaffolding_import( ... )
    Return an anonymous subroutine suitable for use an an import function

    Anything passable to ->scaffold is fair game. In addition:

        scaffolder      This will default to the package of caller() if unspecified

        chain_import    An (optional) subroutine that will goto'd after scaffolding is complete

  MooseX::Scaffold->setup_scaffolding_import( ... )
    Install an import subroutine. By default, caller() will be used for the
    exporting package, but another may be specified.

    Anything passable to ->build_scaffolding_import is fair game. In

        exporting_package   The package that will house the import subroutine (the scaffolding will trigger
                            when the package is used or imported)

  MooseX::Scaffold->load_package( $package )
  MooseX::Scaffold->load_class( $class )
    A convenience method that will attempt to require $package or $class if
    not already loaded

    Essentially does ...

        eval "require $package;" or die $@

    ... but uses Class::Inspector to check for $package existence first
    (%INC is not trustworthy)

    Robert Krimen, "<rkrimen at>"

    You can contribute or fork this project via GitHub:


        git clone git:// MooseX-Scaffold

    Please report any bugs or feature requests to "bug-moosex-classscaffold
    at", or through the web interface at
    <>. I will
    be notified, and then you'll automatically be notified of progress on
    your bug as I make changes.

    You can find documentation for this module with the perldoc command.

        perldoc MooseX::Scaffold

    You can also look for information at:

    *   RT: CPAN's request tracker


    *   AnnoCPAN: Annotated CPAN documentation


    *   CPAN Ratings


    *   Search CPAN


    Copyright 2008 Robert Krimen, all rights reserved.

    This program is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.

Something went wrong with that request. Please try again.