changelog
[gitmo/Package-Stash-XS.git] / lib / Package / Stash.pm
index 0cd0c95..aa8d5fd 100644 (file)
@@ -3,10 +3,6 @@ use strict;
 use warnings;
 # ABSTRACT: routines for manipulating stashes
 
-use Carp qw(confess);
-use Scalar::Util qw(reftype);
-use Symbol;
-
 use XSLoader;
 XSLoader::load(
     __PACKAGE__,
@@ -18,16 +14,57 @@ XSLoader::load(
         ? ${ $Package::Stash::{VERSION} } : (),
 );
 
-# before 5.12, assigning to the ISA glob would make it lose its magical ->isa
-# powers
-use constant BROKEN_ISA_ASSIGNMENT => ($] < 5.012);
+use Package::DeprecationManager -deprecations => {
+    'Package::Stash::add_package_symbol'        => 0.14,
+    'Package::Stash::remove_package_glob'       => 0.14,
+    'Package::Stash::has_package_symbol'        => 0.14,
+    'Package::Stash::get_package_symbol'        => 0.14,
+    'Package::Stash::get_or_add_package_symbol' => 0.14,
+    'Package::Stash::remove_package_symbol'     => 0.14,
+    'Package::Stash::list_all_package_symbols'  => 0.14,
+};
+
+sub add_package_symbol {
+    deprecated('add_package_symbol is deprecated, please use add_symbol');
+    shift->add_symbol(@_);
+}
+
+sub remove_package_glob {
+    deprecated('remove_package_glob is deprecated, please use remove_glob');
+    shift->remove_glob(@_);
+}
+
+sub has_package_symbol {
+    deprecated('has_package_symbol is deprecated, please use has_symbol');
+    shift->has_symbol(@_);
+}
+
+sub get_package_symbol {
+    deprecated('get_package_symbol is deprecated, please use get_symbol');
+    shift->get_symbol(@_);
+}
+
+sub get_or_add_package_symbol {
+    deprecated('get_or_add_package_symbol is deprecated, please use get_or_add_symbol');
+    shift->get_or_add_symbol(@_);
+}
+
+sub remove_package_symbol {
+    deprecated('remove_package_symbol is deprecated, please use remove_symbol');
+    shift->remove_symbol(@_);
+}
+
+sub list_all_package_symbols {
+    deprecated('list_all_package_symbols is deprecated, please use list_all_symbols');
+    shift->list_all_symbols(@_);
+}
 
 =head1 SYNOPSIS
 
   my $stash = Package::Stash->new('Foo');
-  $stash->add_package_symbol('%foo', {bar => 1});
+  $stash->add_symbol('%foo', {bar => 1});
   # $Foo::foo{bar} == 1
-  $stash->has_package_symbol('$foo') # false
+  $stash->has_symbol('$foo') # false
   my $namespace = $stash->namespace;
   *{ $namespace->{foo} }{HASH} # {bar => 1}
 
@@ -53,45 +90,13 @@ Returns the name of the package that this object represents.
 
 Returns the raw stash itself.
 
-=cut
-
-=pod
-
-{
-    my %SIGIL_MAP = (
-        '$' => 'SCALAR',
-        '@' => 'ARRAY',
-        '%' => 'HASH',
-        '&' => 'CODE',
-        ''  => 'IO',
-    );
-
-    sub _deconstruct_variable_name {
-        my ($self, $variable) = @_;
-
-        (defined $variable && length $variable)
-            || confess "You must pass a variable name";
-
-        my $sigil = substr($variable, 0, 1, '');
-
-        if (exists $SIGIL_MAP{$sigil}) {
-            return ($variable, $sigil, $SIGIL_MAP{$sigil});
-        }
-        else {
-            return ("${sigil}${variable}", '', $SIGIL_MAP{''});
-        }
-    }
-}
-
-=cut
-
-=method add_package_symbol $variable $value %opts
+=method add_symbol $variable $value %opts
 
 Adds a new package symbol, for the symbol given as C<$variable>, and optionally
 gives it an initial value of C<$value>. C<$variable> should be the name of
 variable including the sigil, so
 
-  Package::Stash->new('Foo')->add_package_symbol('%foo')
+  Package::Stash->new('Foo')->add_symbol('%foo')
 
 will create C<%Foo::foo>.
 
@@ -111,108 +116,30 @@ determine where the source code for a subroutine can be found.  See
 L<http://perldoc.perl.org/perldebguts.html#Debugger-Internals> for more
 information about C<%DB::sub>.
 
-=method remove_package_glob $name
+=method remove_glob $name
 
 Removes all package variables with the given name, regardless of sigil.
 
-=method has_package_symbol $variable
+=method has_symbol $variable
 
 Returns whether or not the given package variable (including sigil) exists.
 
-=method get_package_symbol $variable
+=method get_symbol $variable
 
 Returns the value of the given package variable (including sigil).
 
-=cut
-
-=pod
-
-sub get_package_symbol {
-    my ($self, $variable, %opts) = @_;
-
-    my ($name, $sigil, $type) = ref $variable eq 'HASH'
-        ? @{$variable}{qw[name sigil type]}
-        : $self->_deconstruct_variable_name($variable);
-
-    my $namespace = $self->namespace;
-
-    if (!exists $namespace->{$name}) {
-        if ($opts{vivify}) {
-            if ($type eq 'ARRAY') {
-                if (BROKEN_ISA_ASSIGNMENT) {
-                    $self->add_package_symbol(
-                        $variable,
-                        $name eq 'ISA' ? () : ([])
-                    );
-                }
-                else {
-                    $self->add_package_symbol($variable, []);
-                }
-            }
-            elsif ($type eq 'HASH') {
-                $self->add_package_symbol($variable, {});
-            }
-            elsif ($type eq 'SCALAR') {
-                $self->add_package_symbol($variable);
-            }
-            elsif ($type eq 'IO') {
-                $self->add_package_symbol($variable, Symbol::geniosym);
-            }
-            elsif ($type eq 'CODE') {
-                confess "Don't know how to vivify CODE variables";
-            }
-            else {
-                confess "Unknown type $type in vivication";
-            }
-        }
-        else {
-            if ($type eq 'CODE') {
-                # this effectively "de-vivifies" the code slot. if we don't do
-                # this, referencing the coderef at the end of this function
-                # will cause perl to auto-vivify a stub coderef in the slot,
-                # which isn't what we want
-                $self->add_package_symbol($variable);
-            }
-        }
-    }
-
-    my $entry_ref = \$namespace->{$name};
-
-    if (ref($entry_ref) eq 'GLOB') {
-        return *{$entry_ref}{$type};
-    }
-    else {
-        if ($type eq 'CODE') {
-            no strict 'refs';
-            return \&{ $self->name . '::' . $name };
-        }
-        else {
-            return undef;
-        }
-    }
-}
+=method get_or_add_symbol $variable
 
-=cut
-
-=method get_or_add_package_symbol $variable
-
-Like C<get_package_symbol>, except that it will return an empty hashref or
+Like C<get_symbol>, except that it will return an empty hashref or
 arrayref if the variable doesn't exist.
 
-=cut
-
-sub get_or_add_package_symbol {
-    my $self = shift;
-    $self->get_package_symbol(@_, vivify => 1);
-}
-
-=method remove_package_symbol $variable
+=method remove_symbol $variable
 
 Removes the package variable described by C<$variable> (which includes the
 sigil); other variables with the same name but different sigils will be
 untouched.
 
-=method list_all_package_symbols $type_filter
+=method list_all_symbols $type_filter
 
 Returns a list of package variable names in the package, without sigils. If a
 C<type_filter> is passed, it is used to select package variables of a given
@@ -221,9 +148,22 @@ etc). Note that if the package contained any C<BEGIN> blocks, perl will leave
 an empty typeglob in the C<BEGIN> slot, so this will show up if no filter is
 used (and similarly for C<INIT>, C<END>, etc).
 
-=head1 BUGS
+=method get_all_symbols $type_filter
+
+Returns a hashref, keyed by the variable names in the package. If
+C<$type_filter> is passed, the hash will contain every variable of that type in
+the package as values, otherwise, it will contain the typeglobs corresponding
+to the variable names (basically, a clone of the stash).
+
+=head1 BUGS / CAVEATS
+
+=over 4
+
+=item * On perl versions prior to 5.10, undefined package scalars will not show up as existing, due to shortcomings within perl.
+
+=item * GLOB and FORMAT variables are not (yet) accessible through this module.
 
-No known bugs.
+=back
 
 Please report any bugs through RT: email
 C<bug-package-stash at rt.cpan.org>, or browse to
@@ -271,8 +211,20 @@ L<http://search.cpan.org/dist/Package-Stash>
 
 Jesse Luehrs <doy at tozt dot net>
 
-Mostly copied from code from L<Class::MOP::Package>, by Stevan Little and the
-Moose Cabal.
+Based on code from L<Class::MOP::Package>, by Stevan Little and the Moose
+Cabal.
+
+=begin Pod::Coverage
+
+add_package_symbol
+remove_package_glob
+has_package_symbol
+get_package_symbol
+get_or_add_package_symbol
+remove_package_symbol
+list_all_package_symbols
+
+=end Pod::Coverage
 
 =cut