On Sep 27, 2011, at 4:25 PM, "Thompson, Thomas J" <thomas.j.thomp...@intel.com> 
wrote:

> Hi,
> 
>  
> 
> I’m an intermediate perl developer with lots to learn, but I think I’ve found 
> an issue with the perl subversion bindings that I’d like to pass by you folks 
> to ensure it’s not just operator error.  I would give you the version I’m 
> working with, but I see no VERSION variable in the SVN::Client module.  What 
> version information would be useful?
> 
>  
> 
> I tried to subclass SVN::Client, but I found that function calls were failing 
> with type errors. I brought this up in this thread on perlmonks:
> 
> http://www.perlmonks.org/?node_id=928123
> 
>  
> 
> I was seeing errors that look like this:
> 
> TypeError in method 'svn_client_ls', argument 2 of type 'char const *'
> 
>  
> 
> I found out this section of code handles arguments for calls to the svn 
> functions:
> 
> # import methods into our name space and wrap them in a closure
> 
> # to support method calling style $ctx->log()
> 
> foreach my $function (@_all_fns)
> 
> {
> 
>     no strict 'refs';
> 
>     my $real_function = \&{"SVN::_Client::svn_client_$function"};
> 
>     *{"SVN::Client::$function"} = sub
> 
>     {
> 
>         my ($self, $ctx);
> 
>         my @args;
> 
>  
> 
>         # Don't shift the first param if it isn't a SVN::Client
> 
>         # object.  This lets the old style interface still work.
> 
>         # And is useful for functions like url_from_path which
> 
>         # don't take a ctx param, but might be called in method
> 
>         # invocation style or as a normal function.
> 
>         for (my $index = $[; $index <= $#_; $index++)
> 
>         {
> 
>             if (ref($_[$index]) eq 'SVN::Client')
> 
>             {
> 
>                 ($self) = splice(@_,$index,1);
> 
>                 $ctx = $self->{'ctx'};
> 
>                 last;
> 
>             } elsif (ref($_[$index]) eq '_p_svn_client_ctx_t') {
> 
>                 $self = undef;
> 
>                 ($ctx) = splice(@_,$index,1);
> 
>                 last;
> 
>             }
> 
>         }
> 
>  
> 
> The problem here is this line:
> 
> if (ref($_[$index]) eq 'SVN::Client')
> 
>  
> 
> This breaks if you attempt to subclass SVN::Client to add functionality.  The 
> result is type errors because the invocant is not removed from the function 
> arguments before being passed through to the svn api.  This should instead be:
> 
> if (UNIVERSAL::isa($_[$index], 'SVN::Client')
>  
> What should I do from here to ensure it is addressed?  I’d like to help out 
> the perl/svn community.

Or even better,

  $_[$index]->isa('SVN::Client')

-Geoff

Reply via email to