Activando $Data::Dumper::Deparse podemos ver la forma del 
constructor proporcionado:
DB<23> use Data::Dumper
DB<24> $Data::Dumper::Deparse = 1
DB<25> p Dumper(\&Foo::new)
$VAR1 = sub {
    package Foo;
    use strict 'refs';
    my($class, %init) = @_;
    $class = 'Foo' unless @_;
    my($r) = {};
    if (defined $init{'c'}) {
        if (ref $init{'c'} eq 'HASH') {
            $$r{'Foo::c'} = 'Tutu'->new(%{$init{'c'};});
        }
        elsif (UNIVERSAL::isa($init{'c'}, 'Tutu')) {
            $$r{'Foo::c'} = $init{'c'};
        }
        else {
            croak('Initializer for c must be hash or Tutu reference');
        }
    }
      croak('Initializer for h must be hash reference') 
    if defined $init{'h'} and ref $init{'h'} ne 'HASH';
    $$r{'Foo::h'} = defined $init{'h'} ? $init{'h'} : {};
      croak('Initializer for a must be array reference') 
    if defined $init{'a'} and ref $init{'a'} ne 'ARRAY';
    $$r{'Foo::a'} = defined $init{'a'} ? $init{'a'} : [];
    $$r{'Foo::s'} = defined $init{'s'} ? $init{'s'} : undef;
    bless $r, $class;
};
Casiano Rodríguez León
