NAME
Module::Generate - Assisting with module generation.
VERSION
Version 1.01
SYNOPSIS
use Module::Generate;
Module::Generate->dist('Plane')
->author('LNATION')
->email('email@lnation.org')
->version('0.01')
->class('Plane')
->abstract('Plane')
->our('$type')
->begin(sub {
$type = 'boeing';
})
->new
->pod('Instantiate a new plane.')
->example('my $plane = Plane->new')
->accessor('airline')
->sub('type')
->code(sub { $type })
->pod('Returns the type of plane.')
->example('$plane->type')
->sub('altitude')
->code(sub {
$_[1] / $_[2];
...
})
->pod('Discover the altitude of the plane.')
->example('$plane->altitude(100, 100)')
->generate;
...
Module::Generate->dist('Holiday')
->author('LNATION')
->email('email@lnation.org')
->version('0.01')
->class('Feed::Data')
->use('Data::LnArray')
->our('$holiday')
->begin(sub {
$holiday = Data::LnArray->new;
})
->sub('parse')
->sub('write')
->sub('render')
->sub('generate')
->sub('_raw')
->sub('_text')
->sub('_json')
->generate;
SUBROUTINES/METHODS
start
Instantiate a new Module::Generate object.
my $mg = Module::Generate->start;
dist
Provide a name for the distribution.
my $dist = Module::Generate->dist('Plane');
lib
Provide a path where the generated files will be compiled.
my $module = Module::Generate->lib('./path/to/lib');
tlib
Provide a path where the generated test will be compiled.
my $module = Module::Generate->tlib('./path/to/t');
author
The author of the distribution/module.
my $module = Module::Generate->author('LNATION');
The authors email of the distribution/module.
my $module = Module::Generate->email('email@lnation.org');
version
The version number of the distribution/module.
my $version = Module::Generate->version('0.01');
class
Start a new class/package/module..
my $class = Module::Generate->class('Plane');
abstract
Provide abstract text for the class.
$class->abstract('Over my head.');
synopsis
Provide a synopsis for the class.
$class->synopsis('...');
no_strict
Disable strict by flag.
$class->no_strict('refs');
no_warnings
Disable warnings by flag.
$class->no_warnings('reserved');
use
Declare modules that should be included in the class.
$class->use(qw/Moo MooX::LazierAttributes/);
base
Establish an ISA relationship with base classes at compile time.
Unless you are using the fields pragma, consider this discouraged in favor of the lighter-weight parent.
$class->base(qw/Foo Bar/);
parent
Establish an ISA relationship with base classes at compile time.
$class->parent(qw/Foo Bar/);
require
Require library files to be included if they have not already been included.
$class->require(qw/Foo Bar/);
our
Declare variable of the same name in the current package for use within the lexical scope.
$class->our(qw/$one $two/);
begin
Define a code block is executed as soon as possible.
$class->begin(sub {
...
});
unitcheck
Define a code block that is executed just after the unit which defined them has been compiled.
$class->unitcheck(sub {
...
});
check
Define a code block that is executed just after the initial Perl compile phase ends and before the run time begins.
$class->check(sub {
...
});
init
Define a code block that is executed just before the Perl runtime begins execution.
$class->init(sub {
...
});
end
Define a code block is executed as late as possible.
$class->end(sub {
...
});
new
Define an object constructor.
$class->new;
equivalent to:
sub new {
my ($cls, %args) = (shift, scalar @_ == 1 ? %{$_[0]} : @_);
bless \%args, $cls;
}
optionally you can pass your own sub routine.
$class->new(sub { ... });
accessor
Define a accessor.
$class->accessor('test');
equivalent to:
sub test {
my ($self, $value) = @_;
if ($value) {
$self->{$sub} = $value;
}
return $self->{$sub}
}";
sub
Define a sub routine/method.
my $sub = $class->sub('name');
code
Define the code that will be run for the sub.
$sub->code(sub {
return 'Robert';
});
pod
Provide pod text that describes the sub.
$sub->pod('What is my name?');
example
Provide a code example which will be suffixed to the pod definition.
$sub->example('$foo->name');
test
Provide tests for the sub.
$sub->test(['is', '$obj->name', q|'test'|], [ ... ], ...)
macro
Implement a macro that can be inserted across classes.
my $mg = Module::Generate->author('LNATION')
->email('email@lnation.org')
->version('0.01');
$mg->macro('self', sub {
my ($self, $value) = @_;
});
my $class = $mg->class('Foo');
$class->sub('bar')
->code(sub { &self; $value; });
$mg->generate;
###
package Foo;
use strict;
use warnings;
our $VERSION = 0.01;
sub bar {
my ( $self, $value ) = @_;
$value;
}
1;
__END__
keyword
Implement a keyword that can be used accross classes.
my $mg = Module::Generate
->author('LNATION')
->email('email@lnation.org');
$mg->keyword('with', sub {
my ($meta) = @_;
return qq|with $meta->{with};|;
});
$mg->keyword('has',
CODE => sub {
my ($meta) = @_;
$meta->{is} ||= q|'ro'|;
my $attributes = join ', ', map {
($meta->{$_} ? (sprintf "%s => %s", $_, $meta->{$_}) : ())
} qw/is required/;
my $code = qq|
has $meta->{has} => ( $attributes );|;
return $code;
},
KEYWORDS => [qw/is required/],
POD_TITLE => 'ATTRIBUTES',
POD_POD => 'get or set $keyword',
POD_EXAMPLE => "\$obj->\$keyword;\n\n\t\$obj->\$keyword(\$value);"
);
$mg->class('Keyword')
->use('Moo')
->with(qw/'Keyword::Role'/)
->test(
['ok', q|my $obj = Keyword->new( thing => 'abc', test => 'def' )|],
['is', q|$obj->test|, q|'def'|]
)
->has('thing')->required(1)
->test(
['ok', q|my $obj = Keyword->new( thing => 'abc' )|],
['is', q|$obj->thing|, q|'abc'|],
['eval', q|$obj = Keyword->new()|, 'required']
);
$mg->class('Keyword::Role')
->use('Moo::Role')
->has('test')->is(q|'rw'|)
->test(
['ok', q|my $obj = do { eval q{
package FooBar;
use Moo;
with 'Keyword::Role';
1;
}; 1; } && FooBar->new| ],
['is', q|$obj->test|, q|undef|],
['ok', q|$obj->test('abc')|],
['is', q|$obj->test|, q|'abc'|]
);
generate
Compile the code.
$sub->generate();
AUTHOR
LNATION, <email at lnation.org>
BUGS
Please report any bugs or feature requests to bug-module-generate at rt.cpan.org
, or through the web interface at https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Module-Generate. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Module::Generate
You can also look for information at:
RT: CPAN's request tracker (report bugs here)
AnnoCPAN: Annotated CPAN documentation
CPAN Ratings
Search CPAN
ACKNOWLEDGEMENTS
LICENSE AND COPYRIGHT
This software is Copyright (c) 2020 by LNATION.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)