The following script p.pl
works fine:
use feature qw(say);
use strict;
use warnings;
use lib '.';
use P1;
my $obj = P1->new(name => 'John');
say "The name is: ", $obj->name;
where the class P1
is defined in file P1.pm
:
package P1;
use Moose;
has name => (is => 'rw', isa => 'Str');
1;
However, when I try to move the class P1.pm
into the main script:
#! /usr/bin/env perl
use feature qw(say);
use strict;
use warnings;
my $obj = P1->new(name => 'John');
say "The name is: ", $obj->name;
package P1;
use Moose;
has name => (is => 'rw', isa => 'Str');
I get error:
Can't locate object method "name" via package "P1" at ./p.pl line 8.
You are trying to use the attribute before executing the call to has
that creates it.
A relatively simple method to inline module follows:
use feature qw(say);
use strict;
use warnings;
use FindBin qw( $RealBin );
use lib $RealBin;
BEGIN {
package P1;
use Moose;
has name => (is => 'rw', isa => 'Str');
$INC{"P1.pm"} = 1;
}
use P1;
my $obj = P1->new(name => 'John');
say "The name is: ", $obj->name;
Keep in mind it's still not quite equivalent. For example, the module is now in scope of the three pragmas in your script. Maybe you should use App::FatPacker or similar instead.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With