summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2010-11-15 10:50:59 -0600
committerJesse Luehrs <doy@tozt.net>2010-11-15 10:56:55 -0600
commitc53d2df2c524d9db9af996ac6543831c480b2092 (patch)
tree12e6f7e2a8f19655ab19161020e3fa8e4addfcc6 /lib
parentc52f752e4094e5fd57f269a87ef252c56a328100 (diff)
downloadpackage-stash-xs-c53d2df2c524d9db9af996ac6543831c480b2092.tar.gz
package-stash-xs-c53d2df2c524d9db9af996ac6543831c480b2092.zip
convert the XS implementation to its own dist
Diffstat (limited to 'lib')
-rw-r--r--lib/Package/Stash.pm231
-rw-r--r--lib/Package/Stash/XS.pm88
2 files changed, 88 insertions, 231 deletions
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;