Moose Namespace collision

Dieser Post wurde aus meiner alten WordPress-Installation importiert. Sollte es Darstellungsprobleme, falsche Links oder fehlende Bilder geben, bitte einfach hier einen Kommentar hinterlassen. Danke.

I'm working on one Moose-based project and ran into bad difficulties yesterday. Suspicious compile time errors, default value subroutines being called way too early and with an empty hash reference as argument instead of an object. It took me hours and some hints from #moose on to find a workaround and finally today, I was able to reproduce the problem.

The script is very simple:


use MyMoose::Project::Template;use MyMoose::Project;

print "project = ".($project = MyMoose::Project->new(pk => 1));print "template = ".($template = $project->Template);

Load two modules, create two objects and print them.


The first module file MyMoose/ doesn't do much more than creating a Template property:

use MooseX::Declare;use Method::Signatures::Modifiers;

class MyMoose::Project { use MyMoose::Project::Template;

has 'pk' => (is => 'rw', isa => 'Num', required => 1);

has 'Template' => ( is => 'ro', isa => 'MyMoose::Project::Template', lazy => 1, default => sub { warn join(':',(caller)[1,2]).' '.Dumper(@_); return MyMoose::Project::Template->new( project_pk => $_[0]->pk, project => $_[0]); }, );}


The second module file MyMoose/Project/ doesn't need much at all:
use MooseX::Declare;use Method::Signatures::Modifiers;

class MyMoose::Project::Template { use MyMoose::Project; # Required lateron by cutted code parts}

I shortend both files here to reduce the size of this blog post. The complete files are available in the download package.


Running returns an error:

$ ./ reader MyMoose::Project::Template (defined at MyMoose/ line 33):6 $VAR1 = {};Can't call method "pk" on unblessed reference at MyMoose/ line 31.Compilation failed in require at ./ line 3.BEGIN failed--compilation aborted at ./ line 3.
I colored the error message lines and the referenced lines in the source code.

The problem doesn't appear if the use lines in the script are switched. Loading MyMoose::Project before MyMoose::Project::Template solves the problem. The problem appeared in my real word project because the second-level-Module was loaded by some old code snippets still waiting for being refactored.


The solution for the project: Rename the property Template to template which violates the project rules (I didn't write them) but solves the namespace collision between the package/class MyMoose::Project::Template and the Template method of MyMoose::Project.

The problem doesn't affect real Perl, a pure Perl sample is also part of the download package.


Noch keine Kommentare. Schreib was dazu

Schreib was dazu

Die folgenden HTML-Tags sind erlaubt:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>