Nick,

> Can we see some code please?

Well, I didn't include any code because it doesn't seem to be
happening in the code on my side ... the argument looks fine well into
the depths of Class::MOP.  But here's my version of load_class:

   # load_class is a bit tougher, because we want to untaint whatever
is passed in
   # note this is not a method, just a sub in our namespace
   sub load_class
   {
       my ($classname) = @_;
       my $modname = $classname;
       $modname =~ s@::@/@g;
       $modname .= '.pm';

       foreach my $dir (@INC)
       {
           my $file = "$dir/$modname";
           if (-r $file)
           {
               # at this point, things look safe
               # let's blatantly untaint the name and pass it on
               $classname =~ /^(.*)$/;
               return Class::MOP::load_class($1);
           }
       }

       # couldn't find it; return false
       return undef;
   }

and here's the method that calls my load_class (note this is a
legacy--i.e. non-Moose--class):

sub business_model {

   my( $self, %args ) = @_;

   unless ( exists $self->{business_model} ) {

       # This is just to avoid circular dependencies
       Company::Moose::load_class( 'Company::CompanyBusinessModel' );

       unless ( eval { $self->{business_model} =
Company::CompanyBusinessModel->new(company => $self) } ) {

           if ($@ =~ /company has no properties/) {

               $self->{business_model} = undef;
           }
           else {

               die;         # unknown error; just rethrow
           }
       }
   }

   return $self->{business_model};
}

Is that what you had in mind?


           -- Buddy

Reply via email to