NAME Sub::Lib - Stuff sub-routines into a run-time namespace. Because. Reasons. SYNOPSIS use Sub::Lib; # create a library my $lib = Sub::Lib->new({ 'log' => sub {print join(' ', localtime. ':', @_), "\n"}, }); # add methods $lib->('info', sub {$lib->('log')->('info:', @_)}); $lib->('warn', sub {$lib->('log')->('warn:', @_)}); # call them directly $lib->('info')->('This is for information'); # or via some sugar $lib->run('warn', 'This is for warnings'); # or via some oo sugar $lib->('method', sub { my ($self, $name, @args) = @_; $self->run($name, @args); }); # calls the 'method' sub-routine from the library as an object # method on $lib. attaches to objects like a virus. $lib->call('method', $lib, 'info', "Have you seen? Oh I've seen."); # cheeseburger { my $sub = $lib->has('warn'); $sub->('I can has.') if $sub; } # in case you don't like exceptions $lib->void('info')->('This has a high probability of working'); $lib->void('ofni')->('Hidden messages go here'); # why not? $lib->curry('warn', 'I know stuff now')->('and later'); # why not? for objects. my $o = $lib->o('method', $lib, 'info'); $o->('I think I am confused'); # closures allow bending time my $y = $lib->y('apex', sub { my ($sub, @args) = @_; $sub->('I can see forever', @args); }, 'or something.'); $lib->('apex', sub {$lib->('log')->('apex:', @_)}); $y->('can you?'); # you have been warned $lib->('info')->('installed subs:', join(', ', keys %{$lib->()})); DESCRIPTION Sub::Lib allows you to store sub-routines into a common library which can then passed around as a variable. It's a run-time namespace. USAGE "new([HASHREF | LIST])" Creates a library object and initializes it with entries that may be passed in as either a "HASH" reference or "LIST" of key-value pairs. The object created is itself a sub-routine that can be called directly in order to run sub-routines stored in the library: $lib->('sub-routine name goes here')->(qw(sub routine args go here)); Additional sub-routines may be added by providing a "CODE" reference: $lib->('a new sub-routine', sub { # code goes here }); If no arguments are passed, the internal library is returned: my $_lib = $lib->(); "has($name)" Returns the sub-routine installed in the library identified by $name or undef if it does not exist. "run($name, [LIST])" Runs the sub-routine stored in the library identified by $name. An exception will be thrown if no sub-routine by that name can be found. Any additional arguments are passed to the sub-routine. "call($object, $name, [LIST])" Calls the sub-routine stored in the library identified by $name as a method to the object in $object. This is similar to "run()" above but uses Perl's object semantics. Additional arguments are passed to the method. "void($name)" Either returns the sub-routine installed in the library identified by $name or returns a void sub-routine. This is useful if you want to blindly call sub-routines and not worry if they exist. It is debatable how useful that is in itself. "curry($name, [LIST])" Returns a sub-routine that, when called, will execute the sub-routine installed in the library identified by $name with arguments in "LIST" prepended. Additional arguments to the call itself are also appended. "o($name, $object, [LIST])" Similar to "curry()" but the sub-routine that is returned will execute a method call on the object specified by $object. "y($name, $sub, [LIST])" Creates an anonymous sub-routine that, when executed, will run the "CODE" reference identified by $sub passing in the sub-routine installed in the library under $name. Arguments passed in "LIST" will be curried along with arguments to the call itself. Unlike other methods, "y()" does not require $name to be installed when called in order to delay execution for as long as possible. AUTHOR jason hord <pravus@cpan.org> LICENSE This software is information. It is subject only to local laws of physics.