Class-Maker
view release on metacpan or search on metacpan
lib/Class/Maker/Basic/Constructor.pm view on Meta::CPAN
warn sprintf "_init_by_args finishes with this = %s", pp( $this ) if $Class::Maker::DEBUG;
return @result;
}
sub _filter_argnames
{
my $temp = shift;
# rename all -arg or --arg fields
foreach my $key ( keys %$temp )
{
if( $key =~ /^\-+(.*)/ )
{
$temp->{$1} = $temp->{$key};
delete $temp->{$key};
}
}
}
sub _defaults
{
my $this = shift;
my $args = shift;
no strict 'refs';
foreach my $attr ( keys %$args )
{
# if( my $coderef = $this->can( $attr ) )
# {
# print "Setting $this default (via coderef $coderef) $attr = ", $args->{$attr}, "\n" if $Class::Maker::DEBUG;
# $coderef->( $this, $args->{$attr} );
# #$this->$attr( $args->{$attr} );
$this->{$attr} = $args->{$attr};
# }
}
}
1;
__END__
# cookbook says in Recipe 13.10
# my $self = bless {}, $class;
#
# for my $class (@ISA) {
# my $meth = $class . "::_init";
# $self->$meth(@_) if $class->can("_init");
# }
# This calls a parent method with our object/package.
# "This is very fragile code" as stated in the cookbook
# recipe 13.10, which breaks into unusability when we
# have following scenario:
#
# The "_init" method of the parent class contains method calls
# of his own class and this method is overriden in this class.
#
# What happens is that within the init method of the foreign
# class the overriden method of the child class is called which
# in most cases leads to wrong initialization of our object.
#
# Further: The main problem is that we call a parent method
# with an object blessed in our current package !
#
# SOLUTION: Correctly create a parent object (which leads to
# the right blessing and therefore for correct package/object
# scenario) and simply copy the attributes of the parent
# to the child.
# store old package/class name
=head1 NAME
Class::Maker - classes, reflection, schemas, serialization, attribute- and multiple inheritance
=head1 SYNOPSIS
use Class::Maker qw(:all);
class Something;
class Person,
{
isa => [ 'Something' ],
public =>
{
scalar => [qw( name age internal )],
},
private
{
int => [qw( internal )],
},
};
sub Person::hello
{
my $this = shift;
$this->_internal( 2123 ); # the private one
printf "Here is %s and i am %d years old.\n", $this->name, $this->age;
};
my $p = Person->new( name => Murat, age => 27 );
$p->hello;
( run in 2.315 seconds using v1.01-cache-2.11-cpan-364913b4093 )