Class-MakeMethods
view release on metacpan or search on metacpan
MakeMethods/Composite/Array.pm view on Meta::CPAN
Method names should start with a letter, followed by zero or more
letters, numbers, or underscores.
=head2 Class::MakeMethods::Composite Declaration Syntax
The Composite syntax also provides several ways to optionally
associate a hash of additional parameters with a given method
name.
=over 4
=item *
I<generator_type> => [ "I<name_1>" => { I<param>=>I<value>... }, ... ]
A hash of parameters to use just for this method name.
(Note: to prevent confusion with self-contained definition hashes,
described below, parameter hashes following a method name must not
contain the key 'name'.)
=item *
I<generator_type> => [ [ "I<name_1>", "I<name_2>", ... ] => { I<param>=>I<value>... } ]
Each of these method names gets a copy of the same set of parameters.
=item *
I<generator_type> => [ { "name"=>"I<name_1>", I<param>=>I<value>... }, ... ]
By including the reserved parameter C<name>, you create a self
contained declaration with that name and any associated hash values.
=back
Basic declarations, as described above, are treated as having an empty parameter hash.
=cut
package Class::MakeMethods::Composite::Array;
$VERSION = 1.000;
use strict;
use Class::MakeMethods::Composite '-isasubclass';
########################################################################
=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.907 second using v1.01-cache-2.11-cpan-364913b4093 )