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 method "pre_insert" of a "Foo::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 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