develooper Front page | perl.moose | Postings from July 2011

setting default behavior

Thread Next
From:
Demian Riccardi
Date:
July 12, 2011 11:15
Subject:
setting default behavior
Message ID:
CACaGo3PuEmdnCTZ6SDYB=yo5x-JZuDRhWDq4C_XydVp_uHkVfw@mail.gmail.com
Hello,

I'm new to Moose and new to OO programming in general.  I apologize in
advance if I mangle language.

In the code attached below, I set up the class Bar that has an arrayref
attribute.  I have a class Foo that has a Bar attribute, foos, and an ifoo
attribute that should point within foos to the element of interest.  I would
like to set up a default behavior where:

my $a = Foo->new(foos=>[0, 1,2]);   sets the first element of foos to the
array ref [0,1,2].  ifoo should be 0 at this point
my $b = $a->foos();                         sets $b to the ifoo element of
foos
$a->foos([3,4,5])                              sets the ifoo element to
array ref [3,4,5];

99   times out of 100     ifoo will be zero and the first element of foos
will be of interest
100 times out of 10000 I'll need to be able to set ifoo to nonzero and
access other elements.  I'm somewhat attached to Bar of the if and when I
add other methods that operates on _bars (foos).   maybe I need to muscle
ifoos into Bar...?

I tried a trigger and failed.

Moose is a powerful drug.

Demian

{
  package Foo;
  use namespace::autoclean;
  use Moose;

  has 'ifoo'  ,    is => 'rw', isa => 'Int' , default => 0;
  has 'foos' => (
                    is      => 'rw',
                    isa     => 'Bar',
                    handles => {
                                add_foos => 'add_bars',
                                get_foos => 'get_bars',
                                set_foos => 'set_bars',
                              count_foos => 'count_bars',
                               },
                    builder  => '_build_foo',
                    trigger  => \&_trigger_foos,
                    lazy     => 1,
                 );

  sub _build_foo{
    return Bar->new();
  }


  sub _trigger_foos
  {
    my $self = shift;
    my $new  = shift;
    if ($new)
    {$self->add_foos($new)}
    else
    {return ($self->get_foos($self->ifoo))};
  }

  __PACKAGE__->meta->make_immutable;
}

{
  package Bar;
  use namespace::autoclean;
  use Moose;

  has '_bars'  =>  (
                    traits   => [ 'Array' ],
                    is       => 'rw',
                    isa      => 'ArrayRef',
                    default  => sub{[]},
                    init_arg => undef,
                    handles  =>
                      {
                        add_bars => 'push',
                        get_bars => 'get',
                        set_bars => 'set',
                        all_bars => 'elements',
                      count_bars => 'count',
                      },
                   );

  __PACKAGE__->meta->make_immutable;

}

use Modern::Perl;
my $a = Foo->new();
#my $a = Foo->new(foos=>[[0,0,0]]);
#my $a = Foo->new(foos=>Bar->new(_bars=>[[0,0,0]]));
$a->add_foos([0,0,0]);
$a->add_foos([1,1,1]);

my $aa = $a->get_foos(0);
my $bb = $a->foos();

use Data::Dumper;

print Dumper $aa;
print Dumper $bb;

1;

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About