Class-Container
view release on metacpan or search on metacpan
lib/Class/Container.pm view on Meta::CPAN
use strict;
package Class::Container;
{
$Class::Container::VERSION = '0.13';
}
my $HAVE_WEAKEN;
BEGIN {
eval {
require Scalar::Util;
Scalar::Util->import('weaken');
$HAVE_WEAKEN = 1;
};
*weaken = sub {} unless defined &weaken;
}
use Carp;
# The create_contained_objects() method lets one object
# (e.g. Compiler) transparently create another (e.g. Lexer) by passing
# creator parameters through to the created object.
#
# Any auto-created objects should be declared in a class's
# %CONTAINED_OBJECTS hash. The keys of this hash are objects which
lib/Class/Container.pm view on Meta::CPAN
(
params => $class->create_contained_objects(@_),
spec => $class->validation_spec,
called => "$class->new()",
), $class;
if ($HAVE_WEAKEN) {
my $c = $self->get_contained_object_spec;
foreach my $name (keys %$c) {
next if $c->{$name}{delayed};
$self->{$name}{container}{container} = $self;
weaken $self->{$name}{container}{container};
}
}
return $self;
}
sub all_specs
{
require B::Deparse;
my %out;
lib/Class/Container.pm view on Meta::CPAN
return \%args;
}
sub create_delayed_object
{
my ($self, $name) = (shift, shift);
croak "Unknown delayed item '$name'" unless $self->{container}{contained}{$name}{delayed};
if ($HAVE_WEAKEN) {
push @_, container => {container => $self};
weaken $_[-1]->{container};
}
return $self->call_method($name, 'new', @_);
}
sub delayed_object_class
{
my $self = shift;
my $name = shift;
croak "Unknown delayed item '$name'"
unless $self->{container}{contained}{$name}{delayed};
( run in 0.586 second using v1.01-cache-2.11-cpan-65fba6d93b7 )