Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Re: array as attributes in OO perl

by TGI (Parson)
on Nov 18, 2008 at 19:04 UTC ( #724352=note: print w/replies, xml ) Need Help??

in reply to array as attributes in OO perl

If you find yourself doing lots of "classical" Perl OO (with blessed hashes or arrays), you may want to take a look at Class::Struct. It provides a simple, but somewhat limited, way of producing your attribute methods. The nice things about Class::Struct are: it is a core module, and it is easy to understand.

If you really want to do OO with all the goodies, all the cool kids are using Moose. I haven't tried it in a project myself, but many people who I respect are using it with good success.

You can easily check to see if an argument is supplied to your setter methods:

use Carp qw(croak); sub set_colour { my $this = shift croak 'set_colour requires an argument' unless @_; $this->{colour} = shift; } # if you like combined setter/getters use Scalar::Util qw(reftype); sub colour { my $this = shift; if ( @_ ) { my $arg = shift; croak 'Illegal value for method colour' unless reftype $arg eq 'ARRAY'; $this->{colour} = $arg; } return @{ $this->{colour}||[] }; }

Some people prefer 'duck-typing' to checking reftype of a value. The basic idea is that if it quacks, it's a duck. So, to test if something is an array, we try treating it like one. If it works, then it's an array (even if it's really a tied hash behind the scenes).

sub colour { my $this = shift; if ( @_ ) { my $arg = shift; local $@; croak 'Illegal value for method colour' unless eval { @$arg; 1 }; $this->{colour} = $arg; } return @{ $this->{colour}||[] }; }

TGI says moo

Replies are listed 'Best First'.
Re^2: array as attributes in OO perl
by IL_MARO (Initiate) on Nov 19, 2008 at 05:11 UTC
    Oh guys, thanks a lot!
    I'm looking at Class::Struct... well, it seems to be understandable :) and furthermore I can use it to solve another problem I have here...

      I'm glad to help.

      An undocumented Class::Struct trick I learned by reading the source, is to call Class::Struct::printem(1);. You can now see the generated code.

      Definitely take the time to really grok the references documentation others have pointed you to. Mastering this material is key to moving to the next level.

      Happy hacking.

      TGI says moo

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://724352]
[ambrus]: hallo, cbstream still working?
[ambrus]: nice, it rarely runs for so long without having to restart it

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (5)
As of 2018-05-24 22:27 GMT
Find Nodes?
    Voting Booth?