Я думаю, что методы пакета - это способ сделать что-то глобально доступным, но не глобальную переменную. Так что-то вроде этого, будет работать:
package MVC;
use strict;
use warnings;
use Scalar::Util qw<refaddr>;
my %MVCs;
sub _domain {
my ( $domain_name, $ref, $value ) = @_;
my $r = \$MVCs{ $key }{ $domain_name };
return unless $$r or ref( $value );
if ( ref $value ) {
$$r = $value;
}
return $$r;
}
sub model { shift; return _domain( 'model', @_ ); }
sub controller { shift; return _domain( 'controller', @_ ); }
sub view { shift; return _domain( 'view', @_ ); }
Таким образом, вне пакета вам нужно просто позвонить так:
my $controller = MVC->controller( $self );
Чтобы получить контроллер, связанный с объектом.
Вы могли бы даже добавить некоторую логику экспорта в аксессоры, например:
unless ( $ref->can( $domain_name )) {
not strict 'refs';
*{ ref( $ref ) . "::$domain_name" }
= sub { _domain( $domain_name, $ref ) }
;
}
Так что вы можете просто сделать это:
$self->view->view_method( @args );