Object references and Class::Struct

Discussion in 'Perl Misc' started by Stephan Mann, Feb 22, 2008.

  1. Stephan Mann

    Stephan Mann Guest

    Hi!

    I need to create a double linked tree so I want to use objects and
    therefore read the Class::Struct manual and the Perl FAQ entry. One
    thing I can't figure out though is how to store a object reference.

    The following code works, and stores references in the childs hash:


    use strict;
    use warnings;
    use Data::Dumper;
    use Class::Struct qw(struct);

    struct FooBar => {
    foo => '$',
    bar => '$',
    parent => 'FooBar',
    childs => '%',
    };

    my $aaa = new FooBar(foo => "aaa", bar => "AAA");
    my $bbb = new FooBar(foo => "bbb", bar => "BBB");
    $bbb->parent($aaa);
    $aaa->childs("bbb" => \$bbb);

    print Dumper($aaa);
    print Dumper($bbb);

    print ${$aaa->childs("bbb")}->foo, "\n";
    print $bbb->parent->foo, "\n";


    According to the manual, I should be able to define

    parent => '*FooBar'

    and store a object reference in it. But I then can't assign a value any
    longer. Both

    $bbb->parent($aaa);
    $bbb->parent(\$aaa);

    give me a "parent argument is wrong class" error. So how do I store a
    object reference in a struct?!

    tia, stephan
     
    Stephan Mann, Feb 22, 2008
    #1
    1. Advertising

  2. Stephan Mann

    rthangam Guest

    On Feb 22, 1:40 pm, Stephan Mann <> wrote:
    > Hi!
    >
    > I need to create a double linked tree so I want to use objects and
    > therefore read the Class::Struct manual and the Perl FAQ entry. One
    > thing I can't figure out though is how to store a object reference.
    >
    > The following code works, and stores references in the childs hash:
    >
    > use strict;
    > use warnings;
    > use Data::Dumper;
    > use Class::Struct qw(struct);
    >
    > struct FooBar => {
    > foo => '$',
    > bar => '$',
    > parent => 'FooBar',
    > childs => '%',
    >
    > };
    >
    > my $aaa = new FooBar(foo => "aaa", bar => "AAA");
    > my $bbb = new FooBar(foo => "bbb", bar => "BBB");
    > $bbb->parent($aaa);
    > $aaa->childs("bbb" => \$bbb);
    >
    > print Dumper($aaa);
    > print Dumper($bbb);
    >
    > print ${$aaa->childs("bbb")}->foo, "\n";
    > print $bbb->parent->foo, "\n";
    >
    > According to the manual, I should be able to define
    >
    > parent => '*FooBar'
    >
    > and store a object reference in it. But I then can't assign a value any
    > longer. Both
    >
    > $bbb->parent($aaa);
    > $bbb->parent(\$aaa);
    >
    > give me a "parent argument is wrong class" error. So how do I store a
    > object reference in a struct?!
    >
    > tia, stephan


    An object is perl is a reference which knows which class it belongs to
    so simply passing $aaa should be enough, which you have done it anyway
    in your code.

    1. An object is simply a reference that happens to know which class
    it belongs to.
    2. A class is simply a package that happens to provide methods to
    deal with object references.
    3. A method is simply a subroutine that expects an object reference
    (or a package name, for class methods) as the first argument.
     
    rthangam, Feb 22, 2008
    #2
    1. Advertising

  3. Stephan Mann

    Stephan Mann Guest

    On 2008-02-22, rthangam wrote:
    > On Feb 22, 1:40 pm, Stephan Mann <> wrote:
    >> struct FooBar => {
    >> foo => '$',
    >> bar => '$',
    >> parent => 'FooBar',
    >> childs => '%',
    >>
    >> };
    >>
    >> my $aaa = new FooBar(foo => "aaa", bar => "AAA");
    >> my $bbb = new FooBar(foo => "bbb", bar => "BBB");
    >> $bbb->parent($aaa);
    >> $aaa->childs("bbb" => \$bbb);
    >>
    >> print Dumper($aaa);
    >> print Dumper($bbb);
    >>
    >> print ${$aaa->childs("bbb")}->foo, "\n";
    >> print $bbb->parent->foo, "\n";

    >
    > An object is perl is a reference which knows which class it belongs to
    > so simply passing $aaa should be enough, which you have done it anyway
    > in your code.
    >
    > 1. An object is simply a reference that happens to know which class
    > it belongs to.
    > 2. A class is simply a package that happens to provide methods to
    > deal with object references.
    > 3. A method is simply a subroutine that expects an object reference
    > (or a package name, for class methods) as the first argument.


    Okay -- but this is kind of confusing, since Data::Dumper shows the one as
    a reference, but the other one not. So I got the feeling I'm copying
    values.

    'FooBar::childs' => {
    'bbb' => \bless( {

    'FooBar::parent' => bless( {

    However, I've now taken a different approach. Since I need multiple
    objects but can't use inheritance because Class::Struct doesn't allow
    @ISA and Export won't work because I don't have multiple files, I'll now
    use a scalar to store my reference.

    parent => '$',
    ....
    $bbb->parent(\$aaa);
    ....
    print ${$bbb->parent}->foo, "\n";

    This works for whatever object I want to store.

    greetings, stephan
     
    Stephan Mann, Feb 22, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Roger Leigh
    Replies:
    8
    Views:
    446
    Karl Heinz Buchegger
    Nov 17, 2003
  2. Patrick Stinson
    Replies:
    1
    Views:
    364
    Dave Townsend
    Sep 6, 2004
  3. DanielEKFA
    Replies:
    8
    Views:
    616
    DanielEKFA
    May 16, 2005
  4. Chris Fogelklou
    Replies:
    36
    Views:
    1,391
    Chris Fogelklou
    Apr 20, 2004
  5. Jack Bates
    Replies:
    3
    Views:
    308
    Steven D'Aprano
    Aug 6, 2011
Loading...

Share This Page