use Class::MOP::Immutable;
-our $VERSION = '0.43';
-our $AUTHORITY = 'cpan:STEVAN';
+BEGIN {
+ our $VERSION = '0.55';
+ our $AUTHORITY = 'cpan:STEVAN';
+
+ use XSLoader;
+ XSLoader::load( 'Class::MOP', $VERSION );
+
+ unless ($] < 5.009_005) {
+ require mro;
+ no warnings 'redefine', 'prototype';
+ *check_package_cache_flag = \&mro::get_pkg_gen;
+ *IS_RUNNING_ON_5_10 = sub () { 1 };
+ }
+ else {
+ *IS_RUNNING_ON_5_10 = sub () { 0 };
+ }
+}
{
# Metaclasses are singletons, so we cache them here.
}
sub is_class_loaded {
- my $class = shift;
- no strict 'refs';
- return 1 if defined ${"${class}::VERSION"} || defined @{"${class}::ISA"};
- foreach (keys %{"${class}::"}) {
- next if substr($_, -2, 2) eq '::';
- return 1 if defined &{"${class}::$_"};
- }
- return 0;
+ my $class = shift;
+ no strict 'refs';
+ return 1 if defined ${"${class}::VERSION"} || defined @{"${class}::ISA"};
+ foreach my $symbol (keys %{"${class}::"}) {
+ next if substr($symbol, -2, 2) eq '::';
+ return 1 if defined &{"${class}::${symbol}"};
+ }
+ return 0;
}
# rather than re-produce it here
'namespace' => \&Class::MOP::Package::namespace
},
- # NOTE:
- # protect this from silliness
- init_arg => '!............( DO NOT DO THIS )............!',
+ init_arg => undef,
default => sub { \undef }
))
);
# rather than re-produce it here
'version' => \&Class::MOP::Module::version
},
- # NOTE:
- # protect this from silliness
- init_arg => '!............( DO NOT DO THIS )............!',
+ init_arg => undef,
default => sub { \undef }
))
);
# rather than re-produce it here
'authority' => \&Class::MOP::Module::authority
},
- # NOTE:
- # protect this from silliness
- init_arg => '!............( DO NOT DO THIS )............!',
+ init_arg => undef,
default => sub { \undef }
))
);
# rather than re-produce it here
'superclasses' => \&Class::MOP::Class::superclasses
},
- # NOTE:
- # protect this from silliness
- init_arg => '!............( DO NOT DO THIS )............!',
+ init_arg => undef,
default => sub { \undef }
))
);
);
Class::MOP::Attribute->meta->add_attribute(
+ Class::MOP::Attribute->new('$!initializer' => (
+ init_arg => 'initializer',
+ reader => { 'initializer' => \&Class::MOP::Attribute::initializer },
+ predicate => { 'has_initializer' => \&Class::MOP::Attribute::has_initializer },
+ ))
+);
+
+Class::MOP::Attribute->meta->add_attribute(
Class::MOP::Attribute->new('$!writer' => (
init_arg => 'writer',
reader => { 'writer' => \&Class::MOP::Attribute::writer },
=head1 DESCRIPTON
-This module is an attempt to create a meta object protocol for the
+This module is a fully functioning meta object protocol for the
Perl 5 object system. It makes no attempt to change the behavior or
characteristics of the Perl 5 object system, only to create a
protocol for its manipulation and introspection.
=head1 PROTOCOLS
-The protocol is divided into 3 main sub-protocols:
+The protocol is divided into 4 main sub-protocols:
=over 4
This provides a consistent represenation for an attribute of a
Perl 5 class. Since there are so many ways to create and handle
-atttributes in Perl 5 OO, this attempts to provide as much of a
+attributes in Perl 5 OO, this attempts to provide as much of a
unified approach as possible, while giving the freedom and
flexibility to subclass for specialization.
See L<Class::MOP::Method> for more details.
+=item The Instance protocol
+
+This provides a layer of abstraction for creating object instances.
+Since the other layers use this protocol, it is relatively easy to
+change the type of your instances from the default HASH ref to other
+types of references. Several examples are provided in the F<examples/>
+directory included in this distribution.
+
+See L<Class::MOP::Instance> for more details.
+
=back
=head1 FUNCTIONS
+=head2 Constants
+
+=over 4
+
+=item I<IS_RUNNING_ON_5_10>
+
+We set this constant depending on what version perl we are on, this
+allows us to take advantage of new 5.10 features and stay backwards
+compat.
+
+=back
+
=head2 Utility functions
=over 4
This will load a given C<$class_name> and if it does not have an
already initialized metaclass, then it will intialize one for it.
+This function can be used in place of tricks like
+C<eval "use $module"> or using C<require>.
=item B<is_class_loaded ($class_name)>
determine as best it can if the C<$class_name> is loaded, it
is probably correct about 99% of the time.
+=item B<check_package_cache_flag ($pkg)>
+
+This will return an integer that is managed by C<Class::MOP::Class>
+to determine if a module's symbol table has been altered.
+
+In Perl 5.10 or greater, this flag is package specific. However in
+versions prior to 5.10, this will use the C<PL_sub_generation> variable
+which is not package specific.
+
+=item B<get_code_info ($code)>
+
+This function returns two values, the name of the package the C<$code>
+is from and the name of the C<$code> itself. This is used by several
+elements of the MOP to detemine where a given C<$code> reference is from.
+
=back
=head2 Metaclass cache functions
=item B<get_metaclass_by_name ($name)>
+This will return a cached B<Class::MOP::Class> instance of nothing
+if no metaclass exist by that C<$name>.
+
=item B<store_metaclass_by_name ($name, $meta)>
+This will store a metaclass in the cache at the supplied C<$key>.
+
=item B<weaken_metaclass ($name)>
+In rare cases it is desireable to store a weakened reference in
+the metaclass cache. This function will weaken the reference to
+the metaclass stored in C<$name>.
+
=item B<does_metaclass_exist ($name)>
+This will return true of there exists a metaclass stored in the
+C<$name> key and return false otherwise.
+
=item B<remove_metaclass_by_name ($name)>
+This will remove a the metaclass stored in the C<$name> key.
+
=back
=head1 SEE ALSO
Yuval (nothingmuch) Kogman
+Scott (konobi) McWhirter
+
=head1 COPYRIGHT AND LICENSE
-Copyright 2006, 2007 by Infinity Interactive, Inc.
+Copyright 2006-2008 by Infinity Interactive, Inc.
L<http://www.iinteractive.com>