
MooseX::Scaffold - Template metaprogramming with Moose

Version 0.04

package MyScaffolder;
use MooseX::Scaffold;
MooseX::Scaffold->setup_scaffolding_import;
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 on-the-fly.
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 create/augment):
load_and_scaffold (scaffold) - Attempt to require My::Class from My/Class.pm 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/Class.pm and stop if that works. If no My/Class.pm 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.

Scaffold a class by either loading it or creating it. You can pass through the following:
scaffolder
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
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')
An alias for ->scaffold
An alias for ->scaffold with load_or_scaffold set to 1
An alias for ->load_or_scaffold
An alias for ->scaffold with scaffold_without_load set to 1
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
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 addition:
exporter
exporting_package The package that will house the import subroutine (the scaffolding will trigger
when the package is used or imported)
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 cpan.org>

You can contribute or fork this project via GitHub:
http://github.com/robertkrimen/moosex-scaffold/tree/master
git clone git://github.com/robertkrimen/moosex-scaffold.git MooseX-Scaffold

Please report any bugs or feature requests to bug-moosex-classscaffold at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=MooseX-Scaffold. 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:


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.