Если я не пытаюсь создать личный пакет, о котором никто не должен знать, я помещаю один пакет в файл.Это решает проблему.Но давайте поместим их в один файл.
Использование загружает файл и вызывает метод import
в этом пакете.Это действительно только случайно, что его аргумент выглядит как имя модуля.Он ищет файл.Если файла там нет, он barfs.
Вы можете сделать это, где BarObj
предполагает, что FooObj
уже существует:
{
package FooObj;
sub new { bless { _count => 0 }, $_[0] }
sub add_data { $_[0]->{_count}++ }
}
{
package BarObj;
use Data::Dumper;
sub new {
bless { myFoo => FooObj->new }, $_[0];
}
sub foo { $_[0]->{myFoo} }
sub some_method { print Dumper( $_[0] ) }
}
my $bar = BarObj->new;
$bar->some_method;
Если вам нужно взаимодействовать спакет (и это все, что есть: не модуль или объект), вам просто нужно определить его, прежде чем вы захотите его использовать.Если вам нужно что-то импортировать, вы можете вызвать import
напрямую:
FooObj->import( ... );
Предположим, есть что-то из FooObj
, которое вы хотите импортировать (но не наследовать!), Вы вызываете import
напрямуюбез нагрузки;
{
package FooObj;
use Data::Dumper;
sub new { bless { _count => 0 }, $_[0] }
sub add_data { $_[0]->{_count}++ }
use Exporter qw(import);
our @EXPORT = qw(dumper);
sub dumper { print Dumper( $_[0] ) }
}
{
package BarObj;
FooObj->import;
sub new {
bless { myFoo => FooObj->new }, $_[0];
}
sub foo { $_[0]->{myFoo} }
# dumper mixin, not inherited.
sub some_method { dumper( $_[0] ) }
}
my $bar = BarObj->new;
$bar->some_method;