gargle has asked for the wisdom of the Perl Monks concerning the following question:

Maybe some of you could shed some light, I'm having the following (silly) problem:

TryOut.pm
package TryOut; use strict; use warnings; { use Object::InsideOut; my @data :Field( 'Standard' => 'data', 'Permission' => 'private'); }
main.pl
#!/usr/bin/perl use strict; use warnings; use TryOut; my $obj = TryOut->new();

When I run main.pl I get:

OIO::Internal error: Failure creating accessor for class 'TryOut' Error: OIO::Method error: Can't call private method 'TryOut->get_data' + from class 'Object::InsideOut' Package: Object::InsideOut File: /usr/local/share/perl/5.8.8/Object/InsideOut.pm ...

Is this normal behaviour? The docs of Object::InsideOut give:

my @data :Field( 'Standard' => 'data', 'Permission' => 'private');

as an example...

I only just installed Object::InsideOut from CPAN and didn't get any errors.

I can image it's nonsense to make up private setters and getters but as it was mentioned in the documentation I thought of giving it a try...

--
if ( 1 ) { $postman->ring() for (1..2); }

Replies are listed 'Best First'.
Re: Object::InsideOut, I don't get it
by liverpole (Monsignor) on Mar 05, 2006 at 17:05 UTC
    Update:  please disregard my advice here, as rhesa correctly points out below.  I should have read the documentation for Object::InsideOut first.

    Two observations:

    1. You are missing sub new just before the beginning '{' in TryOut.pm.
    2. You need a "1;" at the end of TryOut.pm

    So edit TryOut.pm to look like this:

    package TryOut; use strict; use warnings; sub new { use Object::InsideOut; my @data :Field( 'Standard' => 'data', 'Permission' => 'private'); } 1;

    That will get rid of the error.  You will still want to return an actual blessed object from the constructor new, of course.

    Hope that helps!


    @ARGV=split//,"/:L"; map{print substr crypt($_,ord pop),2,3}qw"PerlyouC READPIPE provides"
      You are missing sub new just before the beginning '{' in TryOut.pm
      Uhm, no, that's nonsense. See the Object::InsideOut docs please.

      There _is_ a bug with the "Standard" attribute, but I haven't been able to put my finger on it just yet.

      my @data :Field('Accessor' => 'data'); does generate a data accessor.

      Adding the Permission=>'private' field results in

      OIO::Method error: Can't call private method 'TryOut->data' from class + 'main' Package: main File: object-insideout Line: 19
      So that works as expected. I suspect the "Standard" attribute doesn't actually work as documented. Maybe time for a bug report :)
        There _is_ a bug with the "Standard" attribute, but I haven't been able to put my finger on it just yet

        I was surprised to see this bug so dug through the code a bit. The accessor generation is really woolly code, but as best as I can tell, the bug starts around line 1838, where the get accessors are defined -- it looks like the PRIVATE checks are added to code for later evaluation before the actually beginning of the declaration of the accessor -- so the check is called during the eval of the accessor code and thus fails during compilation.

        Please do file this bug -- jdhedden is very responsive about bug fixes.

        -xdg

        Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

      The brace style is particular to Object::InsideOut and not typical. There's additional commentary about it at AnnoCPAN.

      -xdg

      Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Re: Object::InsideOut, I don't get it
by Anonymous Monk on Mar 06, 2006 at 07:32 UTC
    Well I just LOVE open source :) CPAN already reports the bug is fixed! Big thanks everyone, thanks jdhedden :)