Hello Moosers,
I have a load of methods that I want to set up, and I'm sure that
there must be an easy way to do it that I'm missing.
I've got an index object IndexObject with a set of methods that look
like this:
statements
add_statements
remove_statements
(plus a load more other methods)
I have a graph object with several of these IndexObjects attached to
it in the form of a hash, with the index name as the key and the
IndexObject as the value. In the attributes of the graph object, I have
has 'index_h' => (is=>'rw', isa=>'HashRef[IndexObject]');
and the graph looks like this:
graph => { 'all' => IndexObject, 'links' => IndexObject, 'edges' =>
IndexObject, (etc.) }
The various IndexObjects are accessed using the method $graph-
>get_index_by_name($name)
I want to create a set of methods like this:
links
add_links
remove_links
edges
add_edges
remove_edges
such that (e.g.) $graph->add_links will perform 'add_statements' on
$graph->get_index_by_name('links'), or $graph->remove_edges would
perform 'remove_statements' on $graph->get_index_by_name('edges').
I could write all of these methods out manually, i.e.
sub add_links {
my $self = shift;
my $lix = $self->get_index_by_name('links');
$lix->add_statements(@_)
}
but given that I have four IndexObjects by default, and at least seven
standard methods, it's soon going to get unwieldy.
One thing I considered was to specify that 'index_h' handle all these
methods:
has 'index_h' => (
handles => {
links => 'statements',
edges => 'statements',
add_links => 'add_statements',
add_edges => 'add_statements', [etc.]
});
and then use a method modifier around links, edges, add_links,
add_edges, etc., which would use Sub::Identify to get the name of the
method, extract the index name from it, get that index, and then
perform the method on it:
around qw(links edges add_links add_edges) => sub {
my $method = shift;
my $self = shift;
## use Sub::Identify to find out what the sub is we're calling,
## extract the name of the index
my $name = Sub::Identify::sub_name($method);
$name =~ s/(.+_)?//;
## get the appropriate index
my $ix = $self->get_index_by_name($name);
$ix->$method(@_);
};
This feels like a horrible hack, though. I'm sure there is an
efficient way to do this that I'm missing... can anyone help?
Thank you!
Amelia.