NAME

Module::Generate - Assisting with module generation.

VERSION

Version 0.25

SYNOPSIS

        use Module::Generate;

        Module::Generate->dist('Planes')
                ->author('LNATION')
                ->email('email@lnation.org')
                ->version('0.01')
                ->class('Planes')
                        ->abstract('Over my head.')
                        ->our('$type')
                        ->begin(sub {
                                $type = 'boeing';
                        })
                        ->new
                                ->pod('Instantiate a new plane.')
                                ->example('my $plane = Planes->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('Planes');

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');

email

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('Planes');

abstract

Provide abstract text for the class.

        $class->abstract('Over my head.');

synopsis

Provide a synopsis for the class.

        $class->synopsis('...');

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:

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)