NAME
Class::CompoundMethods - Create methods from components
SYNOPSIS
use Class::CompoundMethods 'append_method';
# This installs both versioning_hook and auditing_hook into the
# method Object::pre_insert.
for my $hook (qw(versioning auditing)) {
append_method( 'Object::pre_insert', "${hook}_hook" );
}
sub versioning_hook { ... }
sub auditing_hook { ... }
DESCRIPTION
This allows you to install more than one method into a single method name. I created this so I could install both versioning and auditing hooks into another module's object space. So instead of creating a single larger method which incorporates the functionality of both hooks I created Class::CompoundMethods::append_method
to install a wrapper method as needed.
If only one method is ever installed into a space, it is installed directly with no wrapper. If you install more than one then append_method
creates a wrapper which calls each of the specified methods in turn.
PUBLIC METHODS
- append_method
-
append_method( $method_name, $method );
This function takes two parameters - the fully qualified name of the method to install into and the method to install.
$method_name
must be the fully qualified method name. This means that for the methodpre_insert
of aFoo::Bar
object you must pass in'Foo::Bar::pre_insert'
.$method
may be either a code reference or the fully qualified name of the method to use.
EXAMPLES
- Example 1
-
use Class::CompoundMethods 'append_method'; # This installs both versioning_hook and auditing_hook into the # method Object::pre_insert. for my $hook (qw(versioning auditing)) { append_method( 'Object::pre_insert', "${hook}_hook" ); } sub versioning_hook { ... } sub auditing_hook { ... }
- Example 2
-
use Class::CompoundMethods 'append_method'; my @versioned_tables = ( .... ); my @audited_tables = ( .... ); for my $table_list ( { tables => \ @versioned_tables, prefix => 'versioned' }, { tables => \ @audited_tables, prefix => 'audited' } ) { my $tables = $table_list->{'tables'}; my $prefix = $table_list->{'prefix'}; for my $table ( @$tables ) { for my $hook ( qw[pre_insert pre_update pre_delete]) { my $method_name = "GreenPartyDB::Database::${table}::${hook}"; my $method_inst = __PACKAGE__ . "::${prefix}_${hook}"; append_method( $method_name, $method_inst ); } } } sub versioned_pre_insert { ... } sub versioned_pre_update { ... } sub versioned_pre_delete { ... } sub audited_pre_insert { ... } sub audited_pre_update { ... } sub audited_pre_delete { ... }
EXPORT
This class optionally exports the append_method
function.
COPYRIGHT & LICENSE
Copyright (c) 2003 Joshua b. Jore All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
AUTHOR
Joshua b. Jore <jjore@cpan.org>
SEE ALSO
RFC Class::AppendMethods http://www.perlmonks.org/index.pl?node_id=252199
Installing chained methods http://www.perlmonks.org/index.pl?node_id=251908