X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FPackage.pm;h=9f497dc1a957c468edb1cfaf9317ae19568c87ff;hb=47d35fbafc21dc6ede2024c81bbb6504e3cb27ae;hp=d87ed79ac4f70698fab96ab5ccd7df4d30358330;hpb=b4bd10ecd2eabe1a2c1bc3addad22b207f6592ee;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Package.pm b/lib/Class/MOP/Package.pm index d87ed79..9f497dc 100644 --- a/lib/Class/MOP/Package.pm +++ b/lib/Class/MOP/Package.pm @@ -8,7 +8,7 @@ use B; use Scalar::Util 'blessed'; use Carp 'confess'; -our $VERSION = '0.77'; +our $VERSION = '0.84'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -79,7 +79,6 @@ sub _new { # all these attribute readers will be bootstrapped # away in the Class::MOP bootstrap section -sub name { $_[0]->{'package'} } sub namespace { # NOTE: # because of issues with the Perl API @@ -129,13 +128,13 @@ sub add_package_symbol { my ($name, $sigil, $type) = ref $variable eq 'HASH' ? @{$variable}{qw[name sigil type]} - : $self->_deconstruct_variable_name($variable); + : $self->_deconstruct_variable_name($variable); my $pkg = $self->{'package'}; no strict 'refs'; - no warnings 'redefine', 'misc'; - *{$pkg . '::' . $name} = ref $initial_value ? $initial_value : \$initial_value; + no warnings 'redefine', 'misc', 'prototype'; + *{$pkg . '::' . $name} = ref $initial_value ? $initial_value : \$initial_value; } sub remove_package_glob { @@ -276,45 +275,6 @@ sub list_all_package_symbols { } } -sub get_all_package_symbols { - my ($self, $type_filter) = @_; - - die "Cannot call get_all_package_symbols as a class method" - unless ref $self; - - my $namespace = $self->namespace; - - return $namespace unless defined $type_filter; - - my %ret; - # for some reason this nasty impl is orders of magnitude faster than a clean version - if ( $type_filter eq 'CODE' ) { - my $pkg; - no strict 'refs'; - %ret = map { - (ref($namespace->{$_}) - ? ( $_ => \&{$pkg ||= $self->name . "::$_"} ) - : ( ref \$namespace->{$_} eq 'GLOB' # don't use {CODE} unless it's really a glob to prevent stringification of stubs - && (*{$namespace->{$_}}{CODE}) # the extra parents prevent breakage on 5.8.2 - ? ( $_ => *{$namespace->{$_}}{CODE} ) - : (do { - my $sym = B::svref_2object(\$namespace->{$_}); - my $svt = ref $sym if $sym; - ($sym && ($svt eq 'B::PV' || $svt eq 'B::IV')) - ? ($_ => ($pkg ||= $self->name)->can($_)) - : () }) ) ) - } keys %$namespace; - } else { - %ret = map { - $_ => *{$namespace->{$_}}{$type_filter} - } grep { - !ref($namespace->{$_}) && *{$namespace->{$_}}{$type_filter} - } keys %$namespace; - } - - return \%ret; -} - 1; __END__ @@ -327,83 +287,84 @@ Class::MOP::Package - Package Meta Object =head1 DESCRIPTION -This is an abstraction of a Perl 5 package, it is a superclass of -L and provides all of the symbol table -introspection methods. - -=head1 INHERITANCE - -B is a subclass of L +The Package Protocol provides an abstraction of a Perl 5 package. A +package is basically namespace, and this module provides methods for +looking at and changing that namespace's symbol table. =head1 METHODS =over 4 -=item B +=item B<< Class::MOP::Package->initialize($package_name) >> + +This method creates a new C instance which +represents specified package. If an existing metaclass object exists +for the package, that will be returned instead. + +=item B<< Class::MOP::Package->reinitialize($package_name) >> -Returns a metaclass for this package. +This method forcibly removes any existing metaclass for the package +before calling C -=item B +Do not call this unless you know what you are doing. -This will initialize a Class::MOP::Package instance which represents -the package of C<$package_name>. +=item B<< $metapackage->name >> -=item B +This is returns the package's name, as passed to the constructor. -This removes the old metaclass, and creates a new one in it's place. -Do B use this unless you really know what you are doing, it could -very easily make a very large mess of your program. +=item B<< $metapackage->namespace >> -=item B +This returns a hash reference to the package's symbol table. The keys +are symbol names and the values are typeglob references. -This is a read-only attribute which returns the package name for the -given instance. +=item B<< $metapackage->add_package_symbol($variable_name, $initial_value) >> -=item B +This method accepts a variable name and an optional initial value. The +C<$variable_name> must contain a leading sigil. -This returns a HASH reference to the symbol table. The keys of the -HASH are the symbol names, and the values are typeglob references. +This method creates the variable in the package's symbol table, and +sets it to the initial value if one was provided. -=item B +=item B<< $metapackage->get_package_symbol($variable_name) >> -Given a C<$variable_name>, which must contain a leading sigil, this -method will create that variable within the package which houses the -class. It also takes an optional C<$initial_value>, which must be a -reference of the same type as the sigil of the C<$variable_name> -implies. +Given a variable name, this method returns the variable as a reference +or undef if it does not exist. The C<$variable_name> must contain a +leading sigil. -=item B +=item B<< $metapackage->has_package_symbol($variable_name) >> -This will return a reference to the package variable in -C<$variable_name>. +Returns true if there is a package variable defined for +C<$variable_name>. The C<$variable_name> must contain a leading sigil. -=item B +=item B<< $metapackage->remove_package_symbol($variable_name) >> -Returns true (C<1>) if there is a package variable defined for -C<$variable_name>, and false (C<0>) otherwise. +This will remove the package variable specified C<$variable_name>. The +C<$variable_name> must contain a leading sigil. -=item B +=item B<< $metapackage->remove_package_glob($glob_name) >> -This will attempt to remove the package variable at C<$variable_name>. +Given the name of a glob, this will remove that glob from the +package's symbol table. Glob names do not include a sigil. Removing +the glob removes all variables and subroutines with the specified +name. -=item B +=item B<< $metapackage->list_all_package_symbols($type_filter) >> -This will attempt to remove the entire typeglob associated with -C<$glob_name> from the package. +This will list all the glob names associated with the current +package. These names do not have leading sigils. -=item B +You can provide an optional type filter, which should be one of +'SCALAR', 'ARRAY', 'HASH', or 'CODE'. -This will list all the glob names associated with the current package. -By inspecting the globs returned you can discern all the variables in -the package. +=item B<< $metapackage->get_all_package_symbols($type_filter) >> -By passing a C<$type_filter>, you can limit the list to only those -which match the filter (either SCALAR, ARRAY, HASH or CODE). +This works much like C, but it returns a +hash reference. The keys are glob names and the values are references +to the value for that name. -=item B +=item B<< Class::MOP::Package->meta >> -Works exactly like C but returns a HASH of -name => thing mapping instead of just an ARRAY of names. +This will return a L instance for this class. =back @@ -413,7 +374,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006-2008 by Infinity Interactive, Inc. +Copyright 2006-2009 by Infinity Interactive, Inc. L