X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FPackage.pm;h=912072b650812b7731531585b7abea4ff1dcbbb9;hb=c23184fc39306590f9e481d76c199020a638bb28;hp=18e2c10b0867712b263107ebccc26795335b7789;hpb=6e57504d833b252832d0f5306f0db97784647148;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Package.pm b/lib/Class/MOP/Package.pm index 18e2c10..912072b 100644 --- a/lib/Class/MOP/Package.pm +++ b/lib/Class/MOP/Package.pm @@ -7,7 +7,7 @@ use warnings; use Scalar::Util 'blessed'; use Carp 'confess'; -our $VERSION = '0.02'; +our $VERSION = '0.05'; our $AUTHORITY = 'cpan:STEVAN'; use base 'Class::MOP::Object'; @@ -28,8 +28,15 @@ sub initialize { # until we can bootstrap it no strict 'refs'; return bless { - '$:package' => $package_name, - '%:namespace' => \%{$package_name . '::'}, + '$!package' => $package_name, + # NOTE: + # because of issues with the Perl API + # to the typeglob in some versions, we + # need to just always grab a new + # reference to the hash in the accessor. + # Ideally we could just store a ref and + # it would Just Work, but oh well :\ + '%!namespace' => \undef, } => $class; } @@ -39,8 +46,18 @@ sub initialize { # all these attribute readers will be bootstrapped # away in the Class::MOP bootstrap section -sub name { $_[0]->{'$:package'} } -sub namespace { $_[0]->{'%:namespace'} } +sub name { $_[0]->{'$!package'} } +sub namespace { + # NOTE: + # because of issues with the Perl API + # to the typeglob in some versions, we + # need to just always grab a new + # reference to the hash here. Ideally + # we could just store a ref and it would + # Just Work, but oh well :\ + no strict 'refs'; + \%{$_[0]->name . '::'} +} # utility methods @@ -80,8 +97,8 @@ sub add_package_symbol { my ($name, $sigil, $type) = $self->_deconstruct_variable_name($variable); no strict 'refs'; - no warnings 'redefine', 'misc'; - *{$self->name . '::' . $name} = ref $initial_value ? $initial_value : \$initial_value; + no warnings 'redefine', 'misc'; + *{$self->name . '::' . $name} = ref $initial_value ? $initial_value : \$initial_value; } sub remove_package_glob { @@ -96,7 +113,7 @@ sub has_package_symbol { my ($self, $variable) = @_; my ($name, $sigil, $type) = $self->_deconstruct_variable_name($variable); - + return 0 unless exists $self->namespace->{$name}; # FIXME: @@ -110,10 +127,10 @@ sub has_package_symbol { if ($type eq 'SCALAR') { my $val = *{$self->namespace->{$name}}{$type}; - defined $$val ? 1 : 0; + defined(${$val}) ? 1 : 0; } else { - defined *{$self->namespace->{$name}}{$type} ? 1 : 0; + defined(*{$self->namespace->{$name}}{$type}) ? 1 : 0; } } @@ -170,8 +187,15 @@ sub remove_package_symbol { } sub list_all_package_symbols { - my ($self) = @_; - return keys %{$self->namespace}; + my ($self, $type_filter) = @_; + return keys %{$self->namespace} unless defined $type_filter; + # NOTE: + # or we can filter based on + # type (SCALAR|ARRAY|HASH|CODE) + my $namespace = $self->namespace; + return grep { + defined(*{$namespace->{$_}}{$type_filter}) + } keys %{$namespace}; } 1; @@ -194,23 +218,53 @@ Class::MOP::Package - Package Meta Object =item B -=item B +=item B =item B +This is a read-only attribute which returns the package name for the +given instance. + =item B -=item B +This returns a HASH reference to the symbol table. The keys of the +HASH are the symbol names, and the values are typeglob references. + +=item B + +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. + +=item B + +This will return a reference to the package variable in +C<$variable_name>. + +=item B + +Returns true (C<1>) if there is a package variable defined for +C<$variable_name>, and false (C<0>) otherwise. + +=item B + +This will attempt to remove the package variable at C<$variable_name>. -=item B +=item B -=item B +This will attempt to remove the entire typeglob associated with +C<$glob_name> from the package. -=item B +=item B -=item B +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 +By passing a C<$type_filter>, you can limit the list to only those +which match the filter (either SCALAR, ARRAY, HASH or CODE). =back