convert the XS implementation to its own dist
Jesse Luehrs [Mon, 15 Nov 2010 16:50:59 +0000 (10:50 -0600)]
17 files changed:
Makefile.PL
XS.xs [moved from Stash.xs with 99% similarity]
dist.ini
inc/MMPackageStash.pm [deleted file]
lib/Package/Stash.pm [deleted file]
lib/Package/Stash/XS.pm [new file with mode: 0644]
t/01-basic.t
t/02-extension.t
t/03-io.t
t/04-get.t
t/05-isa.t
t/06-addsub.t
t/07-edge-cases.t
t/10-synopsis.t
t/20-leaks.t
t/21-leaks-debug.t
t/lib/Package/Stash.pm [new file with mode: 0644]

index 9791d1c..47a3f23 100644 (file)
@@ -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
similarity index 99%
rename from Stash.xs
rename to XS.xs
index 5124997..98648ca 100644 (file)
--- 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
 
index 4c1e18f..f38972f 100644 (file)
--- 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 (file)
index 93c04e4..0000000
+++ /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 (file)
index aa8d5fd..0000000
+++ /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 (file)
index 0000000..0b20026
--- /dev/null
@@ -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;
index 6b85515..79c72f1 100644 (file)
@@ -1,6 +1,7 @@
+#!/usr/bin/env perl
 use strict;
 use warnings;
-
+use lib 't/lib';
 use Test::More;
 use Test::Fatal;
 
index 5e88fa6..2096221 100644 (file)
@@ -1,6 +1,7 @@
+#!/usr/bin/env perl
 use strict;
 use warnings;
-
+use lib 't/lib';
 use Test::More;
 use Test::Fatal;
 
index e061cb2..ecade2a 100644 (file)
--- 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;
 
index 7205457..4f0eb6a 100644 (file)
@@ -1,6 +1,7 @@
 #!/usr/bin/env perl
 use strict;
 use warnings;
+use lib 't/lib';
 use Test::More;
 
 use Package::Stash;
index d0f9b5a..ce852a6 100644 (file)
@@ -1,6 +1,7 @@
 #!/usr/bin/env perl
 use strict;
 use warnings;
+use lib 't/lib';
 use Test::More;
 
 use Package::Stash;
index 1965afd..4889d59 100644 (file)
@@ -1,6 +1,7 @@
+#!/usr/bin/env perl
 use strict;
 use warnings;
-
+use lib 't/lib';
 use Test::More;
 use Test::Fatal;
 
index 2710c5c..17ec84c 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/env perl
 use strict;
 use warnings;
+use lib 't/lib';
 use Test::More;
 
 use Package::Stash;
index ecde8b6..9f59948 100644 (file)
@@ -1,6 +1,7 @@
 #!/usr/bin/env perl
 use strict;
 use warnings;
+use lib 't/lib';
 use Test::More;
 
 use Package::Stash;
index d5dae8a..e97d7d6 100644 (file)
@@ -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';
index 5b2a463..292a28c 100644 (file)
@@ -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 (file)
index 0000000..fb25135
--- /dev/null
@@ -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;