--- Perlbal/Service.pm 2006-12-16 09:55:53.000000000 -0500 +++ /data/share/homes/matt/perlbal/Perlbal-1.47/lib/Perlbal/Service.pm 2006-12-16 10:11:11.000000000 -0500 @@ -698,10 +698,11 @@ # CLASS METHOD - # used by plugins to define a new role that services can take on sub add_role { - my ($role, $creator) = @_; + my ($role, $creator, $selector_creator) = @_; return 0 unless $role && $creator && ref $creator eq 'CODE'; return 0 if $PluginRoles{$role}; - $PluginRoles{$role} = $creator; + $PluginRoles{$role} = {'creator' => $creator, 'selector_creator' => $selector_creator }; + return 1; } @@ -715,7 +716,25 @@ # CLASS METHOD - # returns a defined role creator, if it exists. (undef if it does not) sub get_role_creator { - return $PluginRoles{$_[0]}; + if ($PluginRoles{$_[0]}) { + return $PluginRoles{$_[0]}->{'creator'}; + } + else { + return undef; + } +} + +# CLASS METHOD - +# returns a defined role selector creator, if it exists. (undef if it does not) +sub get_role_selector_creator { + if ($PluginRoles{$_[0]}) + { + return $PluginRoles{$_[0]}->{'selector_creator'}; + } + else + { + return undef; + } } # run the hooks in a list one by one until one hook returns a true @@ -1220,7 +1239,14 @@ Perlbal::ClientProxy->new_from_base($cb); return; } else { - $cb->_simple_response(500, "Can't map to service type $self->{'role'}"); + my $selector_creator = &get_role_selector_creator($self->{'role'}); + + if ( (ref $selector_creator) eq "CODE") { + $selector_creator->($self,$cb); + } + else { + $cb->_simple_response(500, "Can't map to service type $self->{'role'}"); + } } }