Class-Generate

 view release on metacpan or  search on metacpan

lib/Class/Generate.pm  view on Meta::CPAN

    my $i           = 0;
    for my $param (@param_names)
    {
        croak
qq|$cm: Error in new => { style => '... $param' }: $param is not a member|
            if !defined $class->members($param);
        croak
qq|$cm: Error in new => { style => '... $param' }: $param is not a public member|
            if $class->private($param) || $class->protected($param);
    }
    my %uses;
    for my $param (@param_names)
    {
        $uses{$param}++;
    }
    %uses = map( ( $uses{$_} > 1 ? ( $_ => $uses{$_} ) : () ), keys %uses );
    if (%uses)
    {
        croak "$cm: Error in new => { style => '...' }: ",
            join( '; ', map qq|Name "$_" used $uses{$_} times|, keys %uses );
    }
};

$croak_if_duplicate_names = sub {
    my $class_spec = $_[0];
    my ( @names, %uses );
    if ( UNIVERSAL::isa( $class_spec, 'ARRAY' ) )
    {
        for ( my $i = 0 ; $i <= $#$class_spec ; $i += 2 )
        {
            push @names, $$class_spec[$i];
        }
    }
    else
    {
        @names = keys %$class_spec;
    }
    for (@names)
    {
        $uses{ substr( $_, 0, 1 ) eq '&' ? substr( $_, 1 ) : $_ }++;
    }
    %uses = map( ( $uses{$_} > 1 ? ( $_ => $uses{$_} ) : () ), keys %uses );
    if (%uses)
    {
        croak "$cm: ",
            join( '; ', map qq|Name "$_" used $uses{$_} times|, keys %uses );
    }
};

$invalid_spec_message = sub {
    return
        sprintf
        qq|$cm: Invalid specification of %s "%s" ($sh_needed with "%s" key)|,
        @_;
};

package Class::Generate::Class_Holder;    # This package encapsulates functions
$Class::Generate::Class_Holder::VERSION = '1.18';
use strict;    # related to storing and retrieving
               # information on classes.  It lets classes
               # saved in files be reused transparently.
my %classes;

sub store($)
{    # Given a class, store it so it's
    my $class = $_[0];                    # accessible in future invocations of
    $classes{ $class->name } = $class;    # class() and subclass().
}

# Given a class name, try to return an instance of Class::Generate::Class
# that models the class.  The instance comes from one of 3 places.  We
# first try to get it from wherever store() puts it.  If that fails,
# we check to see if the variable %<class_name>::_cginfo exists (see
# form(), below); if it does, we use the information it contains to
# create an instance of Class::Generate::Class.  If %<class_name>::_cginfo
# doesn't exist, the package wasn't created by Class::Generate.  We try
# to infer some characteristics of the class.
sub get($;$)
{
    my ( $class_name, $default_type ) = @_;
    return $classes{$class_name} if exists $classes{$class_name};

    return undef if !eval '%' . $class_name . '::';    # Package doesn't exist.

    my ( $class, %info );
    if ( !eval "exists \$" . $class_name . '::{_cginfo}' )
    {                                                  # Package exists but is
        return undef if !defined $default_type;        # not a class generated
        if ( $default_type eq 'ARRAY' )
        {                                              # by Class::Generate.
            $class = new Class::Generate::Array_Class $class_name;
        }
        else
        {
            $class = new Class::Generate::Hash_Class $class_name;
        }
        $class->constructor( new Class::Generate::Constructor );
        $class->constructor->style( new Class::Generate::Own );
        $classes{$class_name} = $class;
        return $class;
    }

    eval '%info = %' . $class_name . '::_cginfo';
    if ( $info{base} eq 'ARRAY' )
    {
        $class = Class::Generate::Array_Class->new( $class_name,
            last => $info{last} );
    }
    else
    {
        $class = Class::Generate::Hash_Class->new($class_name);
    }
    if ( exists $info{members} )
    {    # Add members ...
        while ( my ( $name, $mem_info_ref ) = each %{ $info{members} } )
        {
            my ( $member, %mem_info );
            %mem_info = %$mem_info_ref;
        DEFN:
            {
                $mem_info{type} eq "\$" and do



( run in 5.052 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )