SPUG: Solution, but not (full) explanation Fwd: Moose: The 'remove_method' cannot be called on an immutable instance

Michael R. Wolf MichaelRWolf at att.net
Wed Mar 2 16:33:25 PST 2011


Here's how I got around the problem.

It got a bit weirder.  When I did a 'perl -cw' on the file, I got the confession below, and an exit code of 255, but when I used the module in another application, it worked fine.  I guess MooseX::FollowPBP (from line 21 below) does some kind of exception processing (possibly via Moose::Exporter).

Any way.  What was broken (but not affecting the application) is now fixed if I pull the module in at run-time instead of compile-time.

   INIT {
       use Class::Load qw(load_class);
       # Can't just 'use' it... there's a circular depencency that
       # breaks MooseX::FollowPBP and
       # Class::MOP::::Class::Immutable::Moose::Meta::Class::remove_method()
       load_class('MyClientName::SocialMedia::JournalMessageBuilder::InnerMessage');
   }
   # BROKEN:
   # use MyClientName::SocialMedia::JournalMessageBuilder::InnerMessage;


Comments welcome...

Begin forwarded message:

> From: "Michael R. Wolf" <MichaelRWolf at att.net>
> Date: March 2, 2011 3:30:30 PM PST
> To: "Spug-List at Pm.Org" <spug-list at pm.org>
> Subject: Moose: The 'remove_method' cannot be called on an immutable instance
> 
> I don't know what that message means.  
> 
> I don't see anything special about 'get_from_email_address', the reader of the 'from_email_address' attribute in the first file, nor 'get_headers' in the second file.  This problem cropped up a while ago, but went away after I did a 'make realclean'.  Not so, this time.
> 
> This problem is showing up in two classes, and they do refer to each other via 'use', so I could see a deadlock condition.  But I don't know how to break that circular compile-time dependency.
> 
> Any ideas on where to continue looking or how to think about it?
> 
> Thanks,
> Michael
> 
> Here's the output from 'perl -cw'
> 
> 
> The 'remove_method' method cannot be called on an immutable instance at /usr/local/lib/perl5/Class/MOP/Class/Immutable/Trait.pm line 32
> 	Class::MOP::Class::Immutable::Trait::_immutable_cannot_call('remove_method') called at /usr/local/lib/perl5/Class/MOP/Class/Immutable/Trait.pm line 37
> 	Class::MOP::Class:::around('CODE(0x8ec5ec0)', 'Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0x9737e10)', 'get_from_email_address') called at /usr/local/lib/perl5/Class/MOP/Method/Wrapped.pm line 159
> 	Class::MOP::Method::Wrapped::__ANON__('Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0x9737e10)', 'get_from_email_address') called at /usr/local/lib/perl5/Class/MOP/Method/Wrapped.pm line 89
> 	Class::MOP::Class::Immutable::Moose::Meta::Class::remove_method('Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0x9737e10)', 'get_from_email_address') called at /usr/local/lib/perl5/Class/MOP/Attribute.pm line 386
> 	Class::MOP::Attribute::__ANON__('get_from_email_address', 'Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0x9737e10)') called at /usr/local/lib/perl5/Class/MOP/Attribute.pm line 398
> 	Class::MOP::Attribute::remove_accessors('Class::MOP::Class::__ANON__::SERIAL::1=HASH(0x976ce08)') called at /usr/local/lib/perl5/Moose/Meta/Attribute.pm line 688
> 	Moose::Meta::Attribute::remove_accessors('Class::MOP::Class::__ANON__::SERIAL::1=HASH(0x976ce08)') called at /usr/local/lib/perl5/Class/MOP/Class.pm line 423
> 	Class::MOP::Class::_remove_generated_metaobjects('Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0x9737e10)') called at /usr/local/lib/perl5/Class/MOP/Class.pm line 60
> 	Class::MOP::Class::reinitialize('Class::MOP::Class::Immutable::Moose::Meta::Class', 'Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0x9737e10)', 'error_class', 'Moose::Error::Default', 'wrapped_method_metaclass', 'Class::MOP::Method::Wrapped', 'instance_metaclass', 'Moose::Meta::Instance', 'method_metaclass', ...) called at /usr/local/lib/perl5/Moose/Meta/Class.pm line 157
> 	Moose::Meta::Class::reinitialize('Class::MOP::Class::Immutable::Moose::Meta::Class', 'Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0x9737e10)', 'attribute_metaclass', 'Class::MOP::Class::__ANON__::SERIAL::1') called at /usr/local/lib/perl5/Moose/Util/MetaRole.pm line 128
> 	Moose::Util::MetaRole::_make_new_metaclass('Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0x9737e10)', 'HASH(0x9340028)', 'class') called at /usr/local/lib/perl5/Moose/Util/MetaRole.pm line 39
> 	Moose::Util::MetaRole::apply_metaroles('for', 'Erado::SocialMedia::JournalMessageBuilder', 'class_metaroles', 'HASH(0x9340028)') called at /usr/local/lib/perl5/Moose/Exporter.pm line 627
> 	Moose::Exporter::__ANON__('MooseX::FollowPBP', 'for_class', 'Erado::SocialMedia::JournalMessageBuilder', 'metaclass', undef, 'meta_name', 'meta') called at /usr/local/lib/perl5/Moose/Exporter.pm line 423
> 	Moose::Exporter::__ANON__('MooseX::FollowPBP') called at lib/Erado/SocialMedia/JournalMessageBuilder.pm line 21
> 	Erado::SocialMedia::JournalMessageBuilder::BEGIN() called at lib/Erado/SocialMedia/JournalMessageBuilder.pm line 21
> 	eval {...} called at lib/Erado/SocialMedia/JournalMessageBuilder.pm line 21
> BEGIN failed--compilation aborted at lib/Erado/SocialMedia/JournalMessageBuilder.pm line 21.
> 
> 
> 
> The 'remove_method' method cannot be called on an immutable instance at /usr/local/lib/perl5/Class/MOP/Class/Immutable/Trait.pm line 32
> 	Class::MOP::Class::Immutable::Trait::_immutable_cannot_call('remove_method') called at /usr/local/lib/perl5/Class/MOP/Class/Immutable/Trait.pm line 37
> 	Class::MOP::Class:::around('CODE(0xa374928)', 'Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0xac3a7d8)', 'get_headers') called at /usr/local/lib/perl5/Class/MOP/Method/Wrapped.pm line 159
> 	Class::MOP::Method::Wrapped::__ANON__('Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0xac3a7d8)', 'get_headers') called at /usr/local/lib/perl5/Class/MOP/Method/Wrapped.pm line 89
> 	Class::MOP::Class::Immutable::Moose::Meta::Class::remove_method('Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0xac3a7d8)', 'get_headers') called at /usr/local/lib/perl5/Class/MOP/Attribute.pm line 386
> 	Class::MOP::Attribute::__ANON__('get_headers', 'Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0xac3a7d8)') called at /usr/local/lib/perl5/Class/MOP/Attribute.pm line 398
> 	Class::MOP::Attribute::remove_accessors('Class::MOP::Class::__ANON__::SERIAL::1=HASH(0xac6d710)') called at /usr/local/lib/perl5/Moose/Meta/Attribute.pm line 688
> 	Moose::Meta::Attribute::remove_accessors('Class::MOP::Class::__ANON__::SERIAL::1=HASH(0xac6d710)') called at /usr/local/lib/perl5/Class/MOP/Class.pm line 423
> 	Class::MOP::Class::_remove_generated_metaobjects('Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0xac3a7d8)') called at /usr/local/lib/perl5/Class/MOP/Class.pm line 60
> 	Class::MOP::Class::reinitialize('Class::MOP::Class::Immutable::Moose::Meta::Class', 'Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0xac3a7d8)', 'error_class', 'Moose::Error::Default', 'wrapped_method_metaclass', 'Class::MOP::Method::Wrapped', 'instance_metaclass', 'Moose::Meta::Instance', 'method_metaclass', ...) called at /usr/local/lib/perl5/Moose/Meta/Class.pm line 157
> 	Moose::Meta::Class::reinitialize('Class::MOP::Class::Immutable::Moose::Meta::Class', 'Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0xac3a7d8)', 'attribute_metaclass', 'Class::MOP::Class::__ANON__::SERIAL::1') called at /usr/local/lib/perl5/Moose/Util/MetaRole.pm line 128
> 	Moose::Util::MetaRole::_make_new_metaclass('Class::MOP::Class::Immutable::Moose::Meta::Class=HASH(0xac3a7d8)', 'HASH(0xa806db0)', 'class') called at /usr/local/lib/perl5/Moose/Util/MetaRole.pm line 39
> 	Moose::Util::MetaRole::apply_metaroles('for', 'Erado::SocialMedia::JournalMessageBuilder::InnerMessage', 'class_metaroles', 'HASH(0xa806db0)') called at /usr/local/lib/perl5/Moose/Exporter.pm line 627
> 	Moose::Exporter::__ANON__('MooseX::FollowPBP', 'for_class', 'Erado::SocialMedia::JournalMessageBuilder::InnerMessage', 'metaclass', undef, 'meta_name', 'meta') called at /usr/local/lib/perl5/Moose/Exporter.pm line 423
> 	Moose::Exporter::__ANON__('MooseX::FollowPBP') called at lib/Erado/SocialMedia/JournalMessageBuilder/InnerMessage.pm line 26
> 	Erado::SocialMedia::JournalMessageBuilder::InnerMessage::BEGIN() called at lib/Erado/SocialMedia/JournalMessageBuilder/InnerMessage.pm line 26
> 	eval {...} called at lib/Erado/SocialMedia/JournalMessageBuilder/InnerMessage.pm line 26
> BEGIN failed--compilation aborted at lib/Erado/SocialMedia/JournalMessageBuilder/InnerMessage.pm line 26.
> -- 
> Michael R. Wolf
>    All mammals learn by playing!
>        MichaelRWolf at att.net
> 
> 
> 

-- 
Michael R. Wolf
    All mammals learn by playing!
        MichaelRWolf at att.net





More information about the spug-list mailing list