NAME Sub::Define - Easily define and redefine variably named subroutines SYNOPSIS use Sub::Define qw/ define_sub /; define_sub(foo => sub { print "I'm &foo!" }); my $old = define_sub('Bar::baz' => sub { print "I'm &Bar::baz!" }); my $pkg = 'Zap'; my $subname = 'zoop'; my $code = sub { print "I'm &$pkg\::$subname!" }; define_sub($pkg, $subname, $code); foo(); Bar::baz(); Zap::zoop(); __END__ I'm &foo! I'm &Bar::baz! I'm &Zap::zoop! DESCRIPTION This module makes it easier for you to define and redefine subroutines with variable names and in variable packages. In order to support alternative package/class definitions any class can override the default behaviour. FUNCTIONS my $old_code = define_sub($subname, $code); The first argument is the name of the subroutine to define and is the subroutine reference which will become it's definition. If the subroutine name is unqualified the the current package will be used. package Foo; define_sub(foo => sub { ... }; # &Foo::foo define_sub('Bar::foo' => sub { ... }); # &Bar::foo This is just like doing package Foo; *foo = sub { ... }; *Bar::foo = sub { ... }; except you can use variables easily. If &define_sub is called in scalar or list context then a reference to any subroutine already used for $subname is returned; otherwise a false value is returned. Calling &define_sub in scalar or list context has the additional effect of silencing any "Subroutine %s redefined" warning. (Note that just as package Foo; *ARGV = sub { ... }; puts the &ARGV subroutine in the "main" package instead of in "Foo", so does package Foo; define_sub(ARGV => sub { ... }); This applies to all symbols that resolve to the "main" package when used unqualified. Fully qualified names aren't effected by this, just as they aren't in subroutine definitions.) Note that if the default behaviour is overridden by the target package it's completely up to the author of that package to decide what it should do and warn about. my $old_code = define_sub($pkg, $subname, $code); If a package name is supplied at the beginning of the argument list, &define_sub will treat it as if it was the current package. package Foo; define_sub('Zap', foo => sub { ... }; # &Zap::foo The behaviour of define_sub('Zap', 'Bar::foo' => sub { ... }); # &Bar::foo i.e. when you have a package name and a fully qualified name is somewhat experimental. OVERRIDING &define_sub A package can override &define_sub by providing a &SUB_DEFINE_define_sub method and inheriting from "Sub::Define::Interface". "Sub::Define::Interface" doesn't provide any functionality but is used to signal that &SUB_DEFINE_define_sub in the package indeed is intended to override the default behaviour &define_sub. Example of overriding &define_sub Let's say we have a class where all subroutines are stored in a hash called %subs. Thus, if you want to install a subroutine, you want to manipulate &subs instead of the symbol table. package HashSubs; use Sub::Define; # create Sub::Define::Interface use base 'Sub::Define::Interface'; my %subs = ( foo => sub { "I'm foo!" }; bar => sub { "I'm bar!" }; ); sub SUB_DEFINE_define_sub { my ($pkg, $name, $code) = @_; my $old = $subs{$name}; $subs{$name} = $code; return $old; } We can now, in any package, do use Sub::Define qw/ define_sub /; define_sub('HashSubs::baz' => sub { "I'm baz!" }); and the baz subroutine is correctly added. EXAMPLES All examples assume use Sub::Define qw/ define_sub /; Generating subroutines for my $name (qw/ foo bar baz /) { define_sub( $name => sub { print "I'm $name!\n"; } ); } foo(); bar(); baz(); __END__ I'm foo! I'm bar! I'm baz! Wrapping subroutines sub foo { print "old foo\n" } my $old; $old = define_sub( foo => sub { $old->(); print "new foo\n"; } ); foo(); __END__ old foo new foo AUTHOR Johan Lodin COPYRIGHT Copyright 2005 Johan Lodin. All rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. SEE ALSO Sub::Name - give internal name to anonymous subroutines (useful for getting informative error messages).