X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP.pm;h=aa7854793167558df2e838a04ff11c22b5aa41e2;hb=4d47b77fec3593e25c28c3126f9b54d7d0bae8e4;hp=c250d2ae9bdcdc7606642f68572a1fa37b53ae8c;hpb=1c02057119480effee157e45ce362dd04f16bebd;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP.pm b/lib/Class/MOP.pm index c250d2a..aa78547 100644 --- a/lib/Class/MOP.pm +++ b/lib/Class/MOP.pm @@ -11,7 +11,9 @@ use Class::MOP::Class; use Class::MOP::Attribute; use Class::MOP::Method; -our $VERSION = '0.12'; +use Class::MOP::Class::Immutable; + +our $VERSION = '0.29_03'; ## ---------------------------------------------------------------------------- ## Setting up our environment ... @@ -37,18 +39,30 @@ our $VERSION = '0.12'; # any subclass of Class::MOP::* will be able to # inherit them using &construct_instance -## Class::MOP::Class +## Class::MOP::Package -Class::MOP::Class->meta->add_attribute( +Class::MOP::Package->meta->add_attribute( Class::MOP::Attribute->new('$:package' => ( - reader => 'name', + reader => { + # NOTE: we need to do this in order + # for the instance meta-object to + # not fall into meta-circular death + 'name' => sub { (shift)->{'$:package'} } + }, init_arg => ':package', )) ); +## Class::MOP::Class + Class::MOP::Class->meta->add_attribute( Class::MOP::Attribute->new('%:attributes' => ( - reader => 'get_attribute_map', + reader => { + # NOTE: we need to do this in order + # for the instance meta-object to + # not fall into meta-circular death + 'get_attribute_map' => sub { (shift)->{'%:attributes'} } + }, init_arg => ':attributes', default => sub { {} } )) @@ -70,17 +84,40 @@ Class::MOP::Class->meta->add_attribute( )) ); +Class::MOP::Class->meta->add_attribute( + Class::MOP::Attribute->new('$:instance_metaclass' => ( + reader => { + # NOTE: we need to do this in order + # for the instance meta-object to + # not fall into meta-circular death + 'instance_metaclass' => sub { (shift)->{'$:instance_metaclass'} } + }, + init_arg => ':instance_metaclass', + default => 'Class::MOP::Instance', + )) +); + ## Class::MOP::Attribute Class::MOP::Attribute->meta->add_attribute( Class::MOP::Attribute->new('name' => ( - reader => 'name' + reader => { + # NOTE: we need to do this in order + # for the instance meta-object to + # not fall into meta-circular death + 'name' => sub { (shift)->{name} } + } )) ); Class::MOP::Attribute->meta->add_attribute( Class::MOP::Attribute->new('associated_class' => ( - reader => 'associated_class' + reader => { + # NOTE: we need to do this in order + # for the instance meta-object to + # not fall into meta-circular death + 'associated_class' => sub { (shift)->{associated_class} } + } )) ); @@ -151,6 +188,16 @@ Class::MOP::Attribute->meta->add_method('clone' => sub { $self->meta->clone_object($self, @_); }); +## Try and close Class::MOP::* + +Class::MOP::Package ->meta->make_immutable(inline_constructor => 0); +Class::MOP::Module ->meta->make_immutable(inline_constructor => 0); +Class::MOP::Class ->meta->make_immutable(inline_constructor => 0); +Class::MOP::Attribute->meta->make_immutable(inline_constructor => 0); +Class::MOP::Method ->meta->make_immutable(inline_constructor => 0); +Class::MOP::Instance ->meta->make_immutable(inline_constructor => 0); + + 1; __END__ @@ -178,6 +225,12 @@ set of extensions to the Perl 5 object system. Every attempt has been made for these tools to keep to the spirit of the Perl 5 object system that we all know and love. +This documentation is admittedly sparse on details, as time permits +I will try to improve them. For now, I suggest looking at the items +listed in the L section for more information. In particular +the book "The Art of the Meta Object Protocol" was very influential +in the development of this system. + =head2 What is a Meta Object Protocol? A meta object protocol is an API to an object system. @@ -406,13 +459,14 @@ L report on this module's test suite. ---------------------------- ------ ------ ------ ------ ------ ------ ------ File stmt bran cond sub pod time total ---------------------------- ------ ------ ------ ------ ------ ------ ------ - Class/MOP.pm 100.0 100.0 100.0 100.0 n/a 21.4 100.0 - Class/MOP/Attribute.pm 100.0 100.0 88.9 100.0 100.0 27.1 99.3 - Class/MOP/Class.pm 100.0 100.0 93.7 100.0 100.0 44.8 99.1 - Class/MOP/Method.pm 100.0 100.0 83.3 100.0 100.0 4.8 97.1 - metaclass.pm 100.0 100.0 80.0 100.0 n/a 1.9 97.3 + Class/MOP.pm 100.0 100.0 100.0 100.0 n/a 19.8 100.0 + Class/MOP/Attribute.pm 100.0 100.0 91.7 61.2 100.0 14.3 87.9 + Class/MOP/Class.pm 97.6 91.3 77.3 98.4 100.0 56.4 93.2 + Class/MOP/Instance.pm 91.1 75.0 33.3 91.7 100.0 6.8 90.7 + Class/MOP/Method.pm 97.6 60.0 52.9 76.9 100.0 1.6 82.6 + metaclass.pm 100.0 100.0 83.3 100.0 n/a 1.0 97.7 ---------------------------- ------ ------ ------ ------ ------ ------ ------ - Total 100.0 100.0 92.2 100.0 100.0 100.0 99.0 + Total 97.5 88.5 75.5 82.8 100.0 100.0 91.2 ---------------------------- ------ ------ ------ ------ ------ ------ ------ =head1 ACKNOWLEDGEMENTS