MooseX::Scaffold - Template metaprogramming with Moose
Version 0.05
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.
use
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
load_or_scaffold
An alias for ->load_or_scaffold
An alias for ->scaffold with scaffold_without_load set to 1
scaffold_without_load
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>
<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.
bug-moosex-classscaffold at rt.cpan.org
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
http://rt.cpan.org/NoAuth/Bugs.html?Dist=MooseX-Scaffold
AnnoCPAN: Annotated CPAN documentation
http://annocpan.org/dist/MooseX-Scaffold
CPAN Ratings
http://cpanratings.perl.org/d/MooseX-Scaffold
Search CPAN
http://search.cpan.org/dist/MooseX-Scaffold
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.
To install MooseX::Scaffold, copy and paste the appropriate command in to your terminal.
cpanm
cpanm MooseX::Scaffold
CPAN shell
perl -MCPAN -e shell install MooseX::Scaffold
For more information on module installation, please visit the detailed CPAN module installation guide.