Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use a Moose class defined in the same file as the main script?

Tags:

perl

moose

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.
like image 977
Håkon Hægland Avatar asked Dec 18 '22 00:12

Håkon Hægland


1 Answers

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.

like image 84
ikegami Avatar answered May 16 '23 06:05

ikegami