| Class-MakeMethods documentation | Contained in the Class-MakeMethods distribution. |
Class::MakeMethods::Standard::Hash - Standard hash methods
package MyObject;
use Class::MakeMethods::Standard::Hash (
new => 'new',
scalar => [ 'foo', 'bar' ],
array => 'my_list',
hash => 'my_index',
);
...
my $obj = MyObject->new( foo => 'Foozle' );
print $obj->foo();
$obj->bar('Barbados');
print $obj->bar();
$obj->my_list(0 => 'Foozle', 1 => 'Bang!');
print $obj->my_list(1);
$obj->my_index('broccoli' => 'Blah!', 'foo' => 'Fiddle');
print $obj->my_index('foo');
The Standard::Hash suclass of MakeMethods provides a basic constructor and accessors for blessed-hash object instances.
When you use this package, the method names you provide
as arguments cause subroutines to be generated and installed in
your module.
See "Calling Conventions" in Class::MakeMethods::Standard for more information.
To declare methods, pass in pairs of a method-type name followed by one or more method names.
Valid method-type names for this package are listed in "METHOD GENERATOR TYPES".
See "Declaration Syntax" in Class::MakeMethods::Standard and "Parameter Syntax" in Class::MakeMethods::Standard for more information.
For each method name passed, returns a subroutine with the following characteristics:
'defaults' = hash_ref> method parameter. Sample declaration and usage:
package MyObject;
use Class::MakeMethods::Standard::Hash (
new => 'new',
);
...
# Bare constructor
my $empty = MyObject->new();
# Constructor with initial values
my $obj = MyObject->new( foo => 'Foozle', bar => 'Barbados' );
# Copy with overriding value
my $copy = $obj->new( bar => 'Bob' );
For each method name passed, uses a closure to generate a subroutine with the following characteristics:
'hash_key' = string> method parameter. Sample declaration and usage:
package MyObject;
use Class::MakeMethods::Standard::Hash (
scalar => 'foo',
);
...
# Store value
$obj->foo('Foozle');
# Retrieve value
print $obj->foo;
For each method name passed, uses a closure to generate a subroutine with the following characteristics:
'hash_key' = string> method parameter. Sample declaration and usage:
package MyObject;
use Class::MakeMethods::Standard::Hash (
array => 'bar',
);
...
# Clear and set contents of list
print $obj->bar([ 'Spume', 'Frost' ] );
# Set values by position
$obj->bar(0 => 'Foozle', 1 => 'Bang!');
# Positions may be overwritten, and in any order
$obj->bar(2 => 'And Mash', 1 => 'Blah!');
# Retrieve value by position
print $obj->bar(1);
# Direct access to referenced array
print scalar @{ $obj->bar() };
There are also calling conventions for slice and splice operations:
# Retrieve slice of values by position
print join(', ', $obj->bar( undef, [0, 2] ) );
# Insert an item at position in the array
$obj->bar([3], 'Potatoes' );
# Remove 1 item from position 3 in the array
$obj->bar([3, 1], undef );
# Set a new value at position 2, and return the old value
print $obj->bar([2, 1], 'Froth' );
For each method name passed, uses a closure to generate a subroutine with the following characteristics:
'hash_key' = string> method parameter. Sample declaration and usage:
package MyObject;
use Class::MakeMethods::Standard::Hash (
hash => 'baz',
);
...
# Set values by key
$obj->baz('foo' => 'Foozle', 'bar' => 'Bang!');
# Values may be overwritten, and in any order
$obj->baz('broccoli' => 'Blah!', 'foo' => 'Fiddle');
# Retrieve value by key
print $obj->baz('foo');
# Retrive slice of values by position
print join(', ', $obj->baz( ['foo', 'bar'] ) );
# Direct access to referenced hash
print keys %{ $obj->baz() };
# Reset the hash contents to empty
%{ $obj->baz() } = ();
For each method name passed, uses a closure to generate a subroutine with the following characteristics:
'hash_key' = string> method parameter. Sample declaration and usage:
package MyObject;
use Class::MakeMethods::Standard::Hash (
object => 'foo',
);
...
# Store value
$obj->foo( Foozle->new() );
# Retrieve value
print $obj->foo;
See Class::MakeMethods for general information about this distribution.
See Class::MakeMethods::Standard for more about this family of subclasses.
| Class-MakeMethods documentation | Contained in the Class-MakeMethods distribution. |
package Class::MakeMethods::Standard::Hash; $VERSION = 1.000; use strict; use Class::MakeMethods::Standard '-isasubclass'; use Class::MakeMethods::Utility::ArraySplicer 'array_splicer'; ########################################################################
sub new { map { my $name = $_->{name}; my $defaults = $_->{defaults} || {}; $name => sub { my $callee = shift; my $self = ref($callee) ? bless( { %$callee }, ref $callee ) : bless( { %$defaults }, $callee ); while ( scalar @_ ) { my $method = shift; UNIVERSAL::can( $self, $method ) or Carp::croak("Can't call method '$method' in constructor for " . ( ref($callee) || $callee )); $self->$method( shift ); } return $self; } } (shift)->_get_declarations(@_) } ########################################################################
sub scalar { map { my $name = $_->{name}; my $hash_key = $_->{hash_key} || $_->{name}; $name => sub { my $self = shift; if ( scalar(@_) == 0 ) { $self->{$hash_key}; } else { $self->{$hash_key} = shift; } } } (shift)->_get_declarations(@_) } ########################################################################
sub array { map { my $name = $_->{name}; my $hash_key = $_->{hash_key} || $_->{name}; my $init = $_->{auto_init}; $name => sub { my $self = shift; if ( scalar(@_) == 0 ) { if ( $init and ! defined $self->{$hash_key} ) { $self->{$hash_key} = []; } ( ! $self->{$hash_key} ) ? () : ( wantarray ) ? @{ $self->{$hash_key} } : $self->{$hash_key} } elsif ( scalar(@_) == 1 and ref $_[0] eq 'ARRAY' ) { $self->{$hash_key} = [ @{ $_[0] } ]; ( ! $self->{$hash_key} ) ? () : ( wantarray ) ? @{ $self->{$hash_key} } : $self->{$hash_key} } else { $self->{$hash_key} ||= []; return array_splicer( $self->{$hash_key}, @_ ); } } } (shift)->_get_declarations(@_) } ########################################################################
sub hash { map { my $name = $_->{name}; my $hash_key = $_->{hash_key} || $_->{name}; my $init = $_->{auto_init}; $name => sub { my $self = shift; if ( scalar(@_) == 0 ) { if ( $init and ! defined $self->{$hash_key} ) { $self->{$hash_key} = {}; } ( ! $self->{$hash_key} ) ? () : ( wantarray ) ? %{ $self->{$hash_key} } : $self->{$hash_key} } elsif ( scalar(@_) == 1 ) { if ( ref($_[0]) eq 'HASH' ) { $self->{$hash_key} = { %{$_[0]} }; } elsif ( ref($_[0]) eq 'ARRAY' ) { return @{$self->{$hash_key}}{ @{$_[0]} } } else { return $self->{$hash_key}->{ $_[0] } } } elsif ( scalar(@_) % 2 ) { Carp::croak "Odd number of items in assigment to $name"; } else { while ( scalar(@_) ) { my $key = shift(); $self->{$hash_key}->{ $key } = shift(); } return $self->{$hash_key}; } } } (shift)->_get_declarations(@_) } ########################################################################
sub object { map { my $name = $_->{name}; my $hash_key = $_->{hash_key} || $_->{name}; my $class = $_->{class}; my $init = $_->{auto_init}; if ( $init and ! $class ) { Carp::croak("Use of auto_init requires value for class parameter") } my $new_method = $_->{new_method} || 'new'; $name => sub { my $self = shift; if ( scalar @_ ) { my $value = shift; if ( $class and ! UNIVERSAL::isa( $value, $class ) ) { Carp::croak "Wrong argument type ('$value') in assigment to $name"; } $self->{$hash_key} = $value; } else { if ( $init and ! defined $self->{$hash_key} ) { $self->{$hash_key} = $class->$new_method(); } $self->{$hash_key}; } } } (shift)->_get_declarations(@_) } ########################################################################
1;