NAME
Package::Pkg - Handy package munging utilities
VERSION
version 0.0020
SYNOPSIS
First, import a new keyword: "pkg"
use Package::Pkg;
Package name formation:
pkg->name( 'Xy', 'A' ) # Xy::Apkg->name( $object, qw/ Cfg / ); # (ref $object)::Cfg
Subroutine installation:
pkg->install( sub { ... } => 'MyPackage::myfunction' );# myfunction in MyPackage is now useableMyPackage->myfunction( ... );
Subroutine exporting:
package MyPackage;use Package::Pkg;sub this { ... }# Setup an exporter (literally sub import { ... }) for# MyPackage, exporting 'this' and 'that'pkg->export( that => sub { ... }, 'this' );package main;use MyPackage;this( ... );that( ... );
DESCRIPTION
Package::Pkg is a collection of useful, miscellaneous package-munging utilities. Functionality is accessed via the imported "pkg" keyword, although you can also invoke functions directly from the package ("Package::Pkg")
USAGE
pkg->install( ... )
Install a subroutine, similar to Sub::Install
This method takes a number of parameters and also has a two- and three-argument form (see below)
# Install an anonymous subroutine as Banana::magicpkg->install( code => sub { ... } , as => 'Banana::magic' )pkg->install( code => sub { ... } , into => 'Banana::magic' ) # Bzzzt! Throws an error!# Install the subroutine Apple::xyzzy as Banana::magicpkg->install( code => 'Apple::xyzzy', as => 'Banana::magic' )pkg->install( code => 'Apple::xyzzy', into => 'Banana', as => 'magic' )pkg->install( from => 'Apple', code => 'xyzzy', as => 'Banana::magic' )pkg->install( from => 'Apple', code => 'xyzzy', into => 'Banana', as => 'magic' )# Install the subroutine Apple::xyzzy as Banana::xyzzypkg->install( code => 'Apple::xyzzy', as => 'Banana::xyzzy' )pkg->install( code => 'Apple::xyzzy', into => 'Banana' )pkg->install( from => 'Apple', code => 'xyzzy', as => 'Banana::xyzzy' )pkg->install( from => 'Apple', code => 'xyzzy', into => 'Banana' )
With implicit "from" (via "caller()")
package Apple;sub xyzzy { ... }# Install the subroutine Apple::xyzzy as Banana::xyzzypkg->install( code => 'xyzzy', as => 'Banana::xyzzy' ) # 'from' is implicitly 'Apple'pkg->install( code => \&xyzzy, as => 'Banana::xyzzy' )
Acceptable parameters are:
code A subroutine reference,A package-with-name identifier, orThe name of a subroutine in the calling packagefrom (optional) A package identifierIf :code is an identifier, then :from is the package wherethe subroutine can be foundIf :code is an identifier and :from is not given, then :fromis assumed to be the calling package (via caller())as The name of the subroutine to install as. Can be a simple name(when paired with :into) or a full package-with-nameinto (optional) A package identifierIf :as is given, then the full name of the installedsubroutine is (:into)::(:as)If :as is not given and we can derive a simple name from:code (It is a package-with-name identifier), then :as will bethe name identifier part of :code
pkg->install( $code => $as )
This is the two-argument form of subroutine installation
Install $code subroutine as $as
pkg->install( sub { ... } => 'Banana::xyzzy' )pkg->install( 'Scalar::Util::blessed' => 'Banana::xyzzy' )pkg->install( 'Scalar::Util::blessed' => 'Banana::' )pkg->install( sub { ... } => 'Banana::' ) # Bzzzt! Throws an error!
$code should be:
- •
-
A CODE reference
sub { ... }
- •
-
A package-with-name identifier
Scalar::Util::blessed
- •
-
The name of a subroutine in the calling package
sub xyzzy { ... }pkg->install( 'xyzzy' => ... )
$as should be:
- •
-
A package-with-name identifier
Acme::Xyzzy::magic
- •
-
A package identifier (with a trailing ::)
Acme::Xyzzy::
pkg->install( $code => $into, $as )
This is the three-argument form of subroutine installation
pkg->install( sub { ... } => 'Banana', 'xyzzy' )pkg->install( sub { ... } => 'Banana::', 'xyzzy' )pkg->install( 'Scalar::Util::blessed' => 'Banana', 'xyzzy' )pkg->install( 'Scalar::Util::blessed' => 'Banana::', 'xyzzy' )
$code can be the same as the two argument form
$into should be:
- •
-
A package identifier (trailing :: is optional)
Acme::Xyzzy::Acme::Xyzzy
$as should be:
- •
-
A name (the name of the subroutine)
xyzzymagic
$package = pkg->name( $part, [ $part, ..., $part ] )
Return a namespace composed by joining each $part with "::"
Superfluous/redundant "::" are automatically cleaned up and stripped from the resulting $package
If the first part leads with a "::", the the calling package will be prepended to $package
pkg->name( 'Xy', 'A::', '::B' ) # Xy::A::Bpkg->name( 'Xy', 'A::' ) # Xy::A::{package Zy;pkg->name( '::', 'A::', '::B' ) # Zy::A::Bpkg->name( '::Xy::A::B' ) # Zy::Xy::A::B}
In addition, if any part is blessed, "name" will resolve that part to the package that the part makes reference to:
my $object = bless {}, 'Xyzzy';pkg->name( $object, qw/ Cfg / ); # Xyzzy::Cfg
SEE ALSO
Sub::Install
Sub::Exporter
AUTHOR
Robert Krimen <[email protected]>
COPYRIGHT AND LICENSE
This software is copyright (c) 2012 by Robert Krimen.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.