Anansi-Class

 view release on metacpan or  search on metacpan

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



=head2 namespace

=over 4

=item self I<(Blessed Hash, Required)>

An object of this namespace.

=back

Returns this object's namespace or B<undef> on error.

=cut


sub namespace {
    my ($self) = @_;
    return if(ref($self) =~ /^(|ARRAY|CODE|FORMAT|GLOB|HASH|IO|LVALUE|REF|Regexp|SCALAR|VSTRING)$/i);
    return ref($self);
}


=head2 new

    my $object = Anansi::Example->new();

    my $object = Anansi::Example->new(
       SETTING => 'example',
    );

=over 4

=item class I<(Blessed Hash B<or> String, Required)>

Either an object or a string of this namespace.

=item parameters I<(Hash, Optional)>

Named parameters.

=back

Instantiates an object instance of a module.  Calls the
L<initialise|Anansi::Class/"initialise"> module with the supplied I<parameters>
after the object is instantiated.  Indirectly called via an extending module
through inheritance.

=cut


sub new {
    my ($class, %parameters) = @_;
    return if(ref($class) =~ /^(ARRAY|CODE|FORMAT|GLOB|HASH|IO|LVALUE|REF|Regexp|SCALAR|VSTRING)$/i);
    $class = ref($class) if(ref($class) !~ /^$/);
    my $self = {
        NAMESPACE => $class,
        PACKAGE => __PACKAGE__,
    };
    bless($self, $class);
    my $objectManager = Anansi::ObjectManager->new();
    $objectManager->register($self);
    $self->initialise(%parameters);
    return $self;
}


=head2 old

    $object->old();

=over 4

=item self I<(Blessed Hash, Required)>

An object of this namespace.

=item parameters I<(Hash, Optional)>

Named parameters.

=back

Enables a module instance object to be externally destroyed.

=cut


sub old {
    my ($self, %parameters) = @_;
    $self->DESTROY();
}


=head2 used

    $object->used('EXAMPLE');

=over 4

=item self I<(Blessed Hash, Required)>

An object of this namespace.

=item parameters I<(Array, Optional)>

An array of strings containing the names of blessed objects currently in use by
this object.

=back

Releases a module instance object to enable it to be destroyed.

=cut


sub used {
    my ($self, @parameters) = @_;
    my $objectManager = Anansi::ObjectManager->new();
    foreach my $key (@parameters) {
        next if(!defined($self->{$key}));
        next if(!defined($self->{$key}->{Anansi}));
        next if(!defined($self->{$key}->{Anansi}->{ObjectManager}));
        next if(!defined($self->{$key}->{Anansi}->{ObjectManager}->{IDENTIFICATION}));
        $objectManager->obsolete(
            USER => $self,
            USES => $self->{$key},
        );
        delete $self->{$key};
    }
}


=head2 uses

    $object->uses(
        EXAMPLE => $example,
    );

    $object->uses(
        EXAMPLE => 'Anansi::Example',
    );
    $object->{EXAMPLE}->doSomething();

=over 4

=item self I<(Blessed Hash, Required)>

An object of this namespace.

=item parameters I<(Hash, Optional)>

A hash containing keys that represent the name to associate with the string
namespace or object within the associated values.

=back

Binds module instance objects to the current object to ensure that the objects
are not prematurely destroyed.  Adds the I<parameters> to the object namespace.

=cut


sub uses {
    my ($self, %parameters) = @_;
    my $objectManager = Anansi::ObjectManager->new();
    $objectManager->current(
        USER => $self,
        USES => [values %parameters],
    );
    while(my ($key, $value) = each(%parameters)) {
        next if(!defined($value->{Anansi}));
        next if(!defined($value->{Anansi}->{ObjectManager}));
        next if(!defined($value->{Anansi}->{ObjectManager}->{IDENTIFICATION}));
        $self->{$key} = $value if(!defined($self->{KEY}));
    }
}


=head2 using

    my $names = $object->using();
    foreach my $name (@{$names}) {
        $object->{$name}->doSomething();
    }

    $object->using('EXAMPLE')->doSomething();

    if(1 == $object->using(
        'EXAMPLE',
        'ANOTHER',
    ));

=over 4

=item self I<(Blessed Hash, Required)>

An object of this namespace.

=item parameters I<(Array B<or> String, Optional)>

A string or an array of strings containing the names of blessed objects
currently in use by this object.

=back

Either returns an array of strings containing the names of the blessed objects
currently in use by this object or the blessed object represented by the single
specified name or whether the specified names represent blessed objects with a
B<1> I<(one)> for yes and B<0> I<(zero)> for no.

=cut


sub using {
    my ($self, @parameters) = @_;
    if(0 == scalar(@parameters)) {
    } elsif(1 == scalar(@parameters)) {
        return if(ref($parameters[0]) !~ /^$/);
        return if($parameters[0] =~ /^\s*$/);
    } else {
        foreach my $parameter (@parameters) {
            return 0 if(ref($parameter) !~ /^$/);
            return 0 if($parameter =~ /^\s*$/);
        }
    }
    my $objectManager = Anansi::ObjectManager->new();
    my $uses = $objectManager->user($self);
    if(defined($uses)) {
    } elsif(0 == scalar(@parameters)) {
        return;
    } elsif(1 == scalar(@parameters)) {
        return 0;
    } else {
        return [];
    }
    my %identifiers = map { $objectManager->identification($_) => 1 } (@{$uses});
    my %names;
    foreach my $name (keys(%{$self})) {
        next if(ref($self->{$name}) =~ /^(|ARRAY|CODE|FORMAT|GLOB|HASH|IO|LVALUE|REF|Regexp|SCALAR|VSTRING)$/i);
        next if(!defined(${$self->{$name}}{Anansi}));
        next if(!defined(${${$self->{$name}}{Anansi}}{ObjectManager}));
        next if(!defined(${${${$self->{$name}}{Anansi}}{ObjectManager}}{IDENTIFICATION}));
        next if(!defined($identifiers{${${${$self->{$name}}{Anansi}}{ObjectManager}}{IDENTIFICATION}}));
        $names{$name} = ${${${$self->{$name}}{Anansi}}{ObjectManager}}{IDENTIFICATION};
    }
    if(0 == scalar(@parameters)) {
        return [(keys(%names))];
    } elsif(1 == scalar(@parameters)) {
        return if(!defined($names{$parameters[0]}));
        return $self->{$parameters[0]};
    }
    foreach my $parameter (@parameters) {
        return 0 if(!defined($names{$parameter}));
    }
    return 1;
}


=head1 NOTES

This module is designed to make it simple, easy and quite fast to code your
design in perl.  If for any reason you feel that it doesn't achieve these goals
then please let me know.  I am here to help.  All constructive criticisms are
also welcomed.

=cut




( run in 0.496 second using v1.01-cache-2.11-cpan-e93a5daba3e )