Class-MakeMethods
view release on metacpan or search on metacpan
MakeMethods/Standard/Array.pm view on Meta::CPAN
);
...
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');
=head1 DESCRIPTION
The Standard::Array suclass of MakeMethods provides a basic
constructor and accessors for blessed-array object instances.
=head2 Calling Conventions
When you C<use> this package, the method names you provide
as arguments cause subroutines to be generated and installed in
your module.
See L<Class::MakeMethods::Standard/"Calling Conventions"> for more information.
=head2 Declaration Syntax
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 L<"METHOD
GENERATOR TYPES">.
See L<Class::MakeMethods::Standard/"Declaration Syntax"> and L<Class::MakeMethods::Standard/"Parameter Syntax"> for more information.
=cut
package Class::MakeMethods::Standard::Array;
$VERSION = 1.000;
use strict;
use Class::MakeMethods::Standard '-isasubclass';
use Class::MakeMethods::Utility::ArraySplicer 'array_splicer';
########################################################################
=head2 Positional Accessors and %FIELDS
Each accessor method is assigned the next available array index at
which to store its value.
The mapping between method names and array positions is stored in
a hash named %FIELDS in the declaring package. When a package
declares its first positional accessor, its %FIELDS are initialized
by searching its inheritance tree.
B<Warning>: Subclassing packages that use positional accessors is
somewhat fragile, since you may end up with two distinct methods assigned to the same position. Specific cases to avoid are:
=over 4
=item *
If you inherit from more than one class with positional accessors,
the positions used by the two sets of methods will overlap.
=item *
If your superclass adds additional positional accessors after you
declare your first, they will overlap yours.
=back
=cut
sub _array_index {
my $class = shift;
my $name = shift;
no strict;
local $^W = 0;
if ( ! scalar %{$class . "::FIELDS"} ) {
my @classes = @{$class . "::ISA"};
my @fields;
while ( @classes ) {
my $superclass = shift @classes;
if ( scalar %{$superclass . "::FIELDS"} ) {
push @fields, %{$superclass . "::FIELDS"};
} else {
unshift @classes, @{$superclass . "::ISA"}
}
}
%{$class . "::FIELDS"} = @fields
}
my $field_hash = \%{$class . "::FIELDS"};
$field_hash->{$name} or $field_hash->{$name} = scalar keys %$field_hash
}
########################################################################
=head1 METHOD GENERATOR TYPES
=head2 new - Constructor
For each method name passed, returns a subroutine with the following characteristics:
=over 4
=item *
Has a reference to a sample item to copy. This defaults to a reference to an empty array, but you may override this with the C<'defaults' => I<array_ref>> method parameter.
=item *
If called as a class method, makes a new array containing values from the sample item, and blesses it into that class.
=item *
If called on an array-based instance, makes a copy of it and blesses the copy into the same class as the original instance.
( run in 0.904 second using v1.01-cache-2.11-cpan-364913b4093 )