summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.PL2
-rw-r--r--XS.xs (renamed from Stash.xs)2
-rw-r--r--dist.ini5
-rw-r--r--inc/MMPackageStash.pm60
-rw-r--r--lib/Package/Stash.pm231
-rw-r--r--lib/Package/Stash/XS.pm88
-rw-r--r--t/01-basic.t3
-rw-r--r--t/02-extension.t3
-rw-r--r--t/03-io.t1
-rw-r--r--t/04-get.t1
-rw-r--r--t/05-isa.t1
-rw-r--r--t/06-addsub.t3
-rwxr-xr-xt/07-edge-cases.t1
-rw-r--r--t/10-synopsis.t1
-rw-r--r--t/20-leaks.t1
-rw-r--r--t/21-leaks-debug.t1
-rw-r--r--t/lib/Package/Stash.pm19
17 files changed, 123 insertions, 300 deletions
diff --git a/Makefile.PL b/Makefile.PL
index 9791d1c..47a3f23 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -6,5 +6,5 @@ use ExtUtils::MakeMaker;
# dependencies, is generated later by Dist::Zilla
WriteMakefile(
- NAME => 'Package::Stash',
+ NAME => 'Package::Stash::XS',
);
diff --git a/Stash.xs b/XS.xs
index 5124997..98648ca 100644
--- a/Stash.xs
+++ b/XS.xs
@@ -338,7 +338,7 @@ SV *_get_symbol(SV *self, varspec_t *variable, int vivify)
}
}
-MODULE = Package::Stash PACKAGE = Package::Stash
+MODULE = Package::Stash::XS PACKAGE = Package::Stash::XS
PROTOTYPES: DISABLE
diff --git a/dist.ini b/dist.ini
index 4c1e18f..f38972f 100644
--- a/dist.ini
+++ b/dist.ini
@@ -1,4 +1,4 @@
-name = Package-Stash
+name = Package-Stash-XS
author = Jesse Luehrs <doy at tozt dot net>
license = Perl_5
copyright_holder = Jesse Luehrs
@@ -6,12 +6,9 @@ copyright_holder = Jesse Luehrs
[@DOY]
:version = 0.05
dist = Package-Stash
-awesome = =inc::MMPackageStash
[Prereqs]
perl = 5.8.3
-Package::DeprecationManager = 0
-Scalar::Util = 0
[Prereqs / TestRequires]
Test::Fatal = 0
diff --git a/inc/MMPackageStash.pm b/inc/MMPackageStash.pm
deleted file mode 100644
index 93c04e4..0000000
--- a/inc/MMPackageStash.pm
+++ /dev/null
@@ -1,60 +0,0 @@
-package inc::MMPackageStash;
-use Moose;
-
-extends 'Dist::Zilla::Plugin::MakeMaker::Awesome';
-
-# XXX: this is pretty gross, it should be possible to clean this up later
-around _build_MakeFile_PL_template => sub {
- my $orig = shift;
- my $self = shift;
- my $template = $self->$orig(@_);
-
- $template =~ s/(use ExtUtils::MakeMaker.*)/$1\n\ncheck_conflicts();/;
-
- $template .= <<'CHECK_CONFLICTS';
-sub check_conflicts {
- my %conflicts = (
- 'Class::MOP' => '1.08',
- 'MooseX::Role::WithOverloading' => '0.08',
- );
- my $found = 0;
- for my $mod ( sort keys %conflicts ) {
- eval "require $mod";
- next if $@;
-
- my $installed = $mod->VERSION();
- if ( $installed le $conflicts{$mod} ) {
-
- print <<"EOF";
-
-***
- This version of Package::Stash conflicts with the version of
- $mod ($installed) you have installed.
-
- You will need to upgrade $mod after installing
- this version of Package::Stash.
-***
-
-EOF
-
- $found = 1;
- }
- }
-
- return unless $found;
-
- # More or less copied from Module::Build
- return if $ENV{PERL_MM_USE_DEFAULT};
- return unless -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT));
-
- sleep 4;
-}
-CHECK_CONFLICTS
-
- return $template;
-};
-
-__PACKAGE__->meta->make_immutable;
-no Moose;
-
-1;
diff --git a/lib/Package/Stash.pm b/lib/Package/Stash.pm
deleted file mode 100644
index aa8d5fd..0000000
--- a/lib/Package/Stash.pm
+++ /dev/null
@@ -1,231 +0,0 @@
-package Package::Stash;
-use strict;
-use warnings;
-# ABSTRACT: routines for manipulating stashes
-
-use XSLoader;
-XSLoader::load(
- __PACKAGE__,
- # we need to be careful not to touch $VERSION at compile time, otherwise
- # DynaLoader will assume it's set and check against it, which will cause
- # fail when being run in the checkout without dzil having set the actual
- # $VERSION
- exists $Package::Stash::{VERSION}
- ? ${ $Package::Stash::{VERSION} } : (),
-);
-
-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_symbol('%foo', {bar => 1});
- # $Foo::foo{bar} == 1
- $stash->has_symbol('$foo') # false
- my $namespace = $stash->namespace;
- *{ $namespace->{foo} }{HASH} # {bar => 1}
-
-=head1 DESCRIPTION
-
-Manipulating stashes (Perl's symbol tables) is occasionally necessary, but
-incredibly messy, and easy to get wrong. This module hides all of that behind a
-simple API.
-
-NOTE: Most methods in this class require a variable specification that includes
-a sigil. If this sigil is absent, it is assumed to represent the IO slot.
-
-=method new $package_name
-
-Creates a new C<Package::Stash> object, for the package given as the only
-argument.
-
-=method name
-
-Returns the name of the package that this object represents.
-
-=method namespace
-
-Returns the raw stash itself.
-
-=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_symbol('%foo')
-
-will create C<%Foo::foo>.
-
-Valid options (all optional) are C<filename>, C<first_line_num>, and
-C<last_line_num>.
-
-C<$opts{filename}>, C<$opts{first_line_num}>, and C<$opts{last_line_num}> can
-be used to indicate where the symbol should be regarded as having been defined.
-Currently these values are only used if the symbol is a subroutine ('C<&>'
-sigil) and only if C<$^P & 0x10> is true, in which case the special C<%DB::sub>
-hash is updated to record the values of C<filename>, C<first_line_num>, and
-C<last_line_num> for the subroutine. If these are not passed, their values are
-inferred (as much as possible) from C<caller> information.
-
-This is especially useful for debuggers and profilers, which use C<%DB::sub> to
-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_glob $name
-
-Removes all package variables with the given name, regardless of sigil.
-
-=method has_symbol $variable
-
-Returns whether or not the given package variable (including sigil) exists.
-
-=method get_symbol $variable
-
-Returns the value of the given package variable (including sigil).
-
-=method get_or_add_symbol $variable
-
-Like C<get_symbol>, except that it will return an empty hashref or
-arrayref if the variable doesn't exist.
-
-=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_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
-type, where valid types are the slots of a typeglob ('SCALAR', 'CODE', 'HASH',
-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).
-
-=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.
-
-=back
-
-Please report any bugs through RT: email
-C<bug-package-stash at rt.cpan.org>, or browse to
-L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Package-Stash>.
-
-=head1 SEE ALSO
-
-=over 4
-
-=item * L<Class::MOP::Package>
-
-This module is a factoring out of code that used to live here
-
-=back
-
-=head1 SUPPORT
-
-You can find this documentation for this module with the perldoc command.
-
- perldoc Package::Stash
-
-You can also look for information at:
-
-=over 4
-
-=item * AnnoCPAN: Annotated CPAN documentation
-
-L<http://annocpan.org/dist/Package-Stash>
-
-=item * CPAN Ratings
-
-L<http://cpanratings.perl.org/d/Package-Stash>
-
-=item * RT: CPAN's request tracker
-
-L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Package-Stash>
-
-=item * Search CPAN
-
-L<http://search.cpan.org/dist/Package-Stash>
-
-=back
-
-=head1 AUTHOR
-
-Jesse Luehrs <doy at tozt dot net>
-
-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
-
-1;
diff --git a/lib/Package/Stash/XS.pm b/lib/Package/Stash/XS.pm
new file mode 100644
index 0000000..0b20026
--- /dev/null
+++ b/lib/Package/Stash/XS.pm
@@ -0,0 +1,88 @@
+package Package::Stash::XS;
+use strict;
+use warnings;
+# ABSTRACT: faster and more correct implementation of the Package::Stash API
+
+use XSLoader;
+XSLoader::load(
+ __PACKAGE__,
+ # we need to be careful not to touch $VERSION at compile time, otherwise
+ # DynaLoader will assume it's set and check against it, which will cause
+ # fail when being run in the checkout without dzil having set the actual
+ # $VERSION
+ exists $Package::Stash::XS::{VERSION}
+ ? ${ $Package::Stash::XS::{VERSION} } : (),
+);
+
+=head1 SYNOPSIS
+
+ use Package::Stash;
+
+=head1 DESCRIPTION
+
+This is a backend for L<Package::Stash>, which provides the functionality in a
+way that's less buggy and much faster. It will be used by default if it's
+installed, and should be preferred in all environments with a compiler.
+
+=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.
+
+=back
+
+Please report any bugs through RT: email
+C<bug-package-stash-xs at rt.cpan.org>, or browse to
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Package-Stash-XS>.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item * L<Class::MOP::Package>
+
+This module is a factoring out of code that used to live here
+
+=back
+
+=head1 SUPPORT
+
+You can find this documentation for this module with the perldoc command.
+
+ perldoc Package::Stash::XS
+
+You can also look for information at:
+
+=over 4
+
+=item * AnnoCPAN: Annotated CPAN documentation
+
+L<http://annocpan.org/dist/Package-Stash-XS>
+
+=item * CPAN Ratings
+
+L<http://cpanratings.perl.org/d/Package-Stash-XS>
+
+=item * RT: CPAN's request tracker
+
+L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Package-Stash-XS>
+
+=item * Search CPAN
+
+L<http://search.cpan.org/dist/Package-Stash-XS>
+
+=back
+
+=head1 AUTHOR
+
+Jesse Luehrs <doy at tozt dot net>
+
+Based on code from L<Class::MOP::Package>, by Stevan Little and the Moose
+Cabal.
+
+=cut
+
+1;
diff --git a/t/01-basic.t b/t/01-basic.t
index 6b85515..79c72f1 100644
--- a/t/01-basic.t
+++ b/t/01-basic.t
@@ -1,6 +1,7 @@
+#!/usr/bin/env perl
use strict;
use warnings;
-
+use lib 't/lib';
use Test::More;
use Test::Fatal;
diff --git a/t/02-extension.t b/t/02-extension.t
index 5e88fa6..2096221 100644
--- a/t/02-extension.t
+++ b/t/02-extension.t
@@ -1,6 +1,7 @@
+#!/usr/bin/env perl
use strict;
use warnings;
-
+use lib 't/lib';
use Test::More;
use Test::Fatal;
diff --git a/t/03-io.t b/t/03-io.t
index e061cb2..ecade2a 100644
--- a/t/03-io.t
+++ b/t/03-io.t
@@ -1,6 +1,7 @@
#!/usr/bin/env perl
use strict;
use warnings;
+use lib 't/lib';
use Test::More;
use Test::Fatal;
diff --git a/t/04-get.t b/t/04-get.t
index 7205457..4f0eb6a 100644
--- a/t/04-get.t
+++ b/t/04-get.t
@@ -1,6 +1,7 @@
#!/usr/bin/env perl
use strict;
use warnings;
+use lib 't/lib';
use Test::More;
use Package::Stash;
diff --git a/t/05-isa.t b/t/05-isa.t
index d0f9b5a..ce852a6 100644
--- a/t/05-isa.t
+++ b/t/05-isa.t
@@ -1,6 +1,7 @@
#!/usr/bin/env perl
use strict;
use warnings;
+use lib 't/lib';
use Test::More;
use Package::Stash;
diff --git a/t/06-addsub.t b/t/06-addsub.t
index 1965afd..4889d59 100644
--- a/t/06-addsub.t
+++ b/t/06-addsub.t
@@ -1,6 +1,7 @@
+#!/usr/bin/env perl
use strict;
use warnings;
-
+use lib 't/lib';
use Test::More;
use Test::Fatal;
diff --git a/t/07-edge-cases.t b/t/07-edge-cases.t
index 2710c5c..17ec84c 100755
--- a/t/07-edge-cases.t
+++ b/t/07-edge-cases.t
@@ -1,6 +1,7 @@
#!/usr/bin/env perl
use strict;
use warnings;
+use lib 't/lib';
use Test::More;
use Package::Stash;
diff --git a/t/10-synopsis.t b/t/10-synopsis.t
index ecde8b6..9f59948 100644
--- a/t/10-synopsis.t
+++ b/t/10-synopsis.t
@@ -1,6 +1,7 @@
#!/usr/bin/env perl
use strict;
use warnings;
+use lib 't/lib';
use Test::More;
use Package::Stash;
diff --git a/t/20-leaks.t b/t/20-leaks.t
index d5dae8a..e97d7d6 100644
--- a/t/20-leaks.t
+++ b/t/20-leaks.t
@@ -1,6 +1,7 @@
#!/usr/bin/env perl
use strict;
use warnings;
+use lib 't/lib';
use Test::More;
use Test::Fatal;
use Test::Requires 'Test::LeakTrace';
diff --git a/t/21-leaks-debug.t b/t/21-leaks-debug.t
index 5b2a463..292a28c 100644
--- a/t/21-leaks-debug.t
+++ b/t/21-leaks-debug.t
@@ -1,6 +1,7 @@
#!/usr/bin/env perl
use strict;
use warnings;
+use lib 't/lib';
use Test::More;
use Test::Fatal;
use Test::Requires 'Test::LeakTrace';
diff --git a/t/lib/Package/Stash.pm b/t/lib/Package/Stash.pm
new file mode 100644
index 0000000..fb25135
--- /dev/null
+++ b/t/lib/Package/Stash.pm
@@ -0,0 +1,19 @@
+package # hide from PAUSE
+ Package::Stash;
+use strict;
+use warnings;
+
+use Package::Stash::XS;
+
+BEGIN {
+ my $ps = Package::Stash::XS->new(__PACKAGE__);
+ my $ps_xs = Package::Stash::XS->new('Package::Stash::XS');
+ for my $method (qw(new name namespace add_symbol remove_glob has_symbol
+ get_symbol get_or_add_symbol remove_symbol
+ list_all_symbols get_all_symbols)) {
+ my $sym = '&' . $method;
+ $ps->add_symbol($sym => $ps_xs->get_symbol($sym));
+ }
+}
+
+1;