Hey Rick,

So I had at look at your code and cleaned it up some what and made it
run within a single file. In the future, please refrain from large
examples. It really helps people to see your problem better if you can
make a very small, very succinct test.

From what I can see, this runs without problem. I did have to change
the 'BAD' tests at the bottom to account for the proper values.

What versions of MooseX::Declare, Devel::Declare,
MooseX::Method::Signatures, Moose, Class::MOP, and perl are you running
where this is a problem? I had thought it might have been the new lines
in your class declaration that were the issue, but it still runs
without issue on my end even with the newlines. My other thought is
perhaps the double package declarations. You do realize that this:

package Foo;

use MooseX::Declare;

class Foo {...}

is essentially doing this:

package Foo;
use MooseX::Declare;
{ package Foo; ... }

right? I know I've had some trouble with Roles in the past where double
declarations of the package has caused issues. If you really want the
package declaration, I suggest scoping it with braces (this is what
I've done when publishing modules to CPAN, so that it runs with the
current CPAN toolset).

That said, there is nothing really in this code that is very demanding
of the feature set provided by MooseX::Declare. I would actually
recommend that you convert this to plain Moose and perhaps use
something like MooseX::Params::Validate for the Hire method.




Here is the cleaned up file that runs without issue:

use MooseX::Declare;
class OOPerlTest::Personal::Person {
    has 'name' => (
        is       => 'rw',
        isa      => 'Str',
        required => 1,
    );
    has 'dateOfBirth' => (
        is       => 'rw',
        isa      => 'Str',
        required => 1,
    );
    has 'alias' => (
        is       => 'rw',
        isa      => 'Str',
        required => 0,
    );
}

class OOPerlTest::Personal::Person::Employee extends
OOPerlTest::Personal::Person {
    use Carp;
    use Date::Manip;
    has 'hireDate' => (
        is       => 'rw',
        isa      => 'Str',
        required => 1,
        trigger  => \&_make_sure_hiredate_is_after_dob,
    );

    sub _make_sure_hiredate_is_after_dob {
        my ($self, $hireDate) = @_;
        $self->dateOfBirth or return;
        my $d1 = ParseDate($self->dateOfBirth);
        my $d2 = ParseDate($hireDate);
        my $flag = Date_Cmp($d1, $d2);
        if ($flag == 1) {
            croak "dateOfBirth must be before hireDate!";
        }
    }
}

class OOPerlTest::Personal::Person::Employee::Manager extends
OOPerlTest::Personal::Person::Employee {
    use Data::Dumper;
    use Date::Manip;
    method Hire (OOPerlTest::Personal::Person $person!) {
        my $employee = OOPerlTest::Personal::Person::Employee->new(
                    name => 'Bill Gates',
                    alias => 'Mr Evil',
                    dateOfBirth => '05/27/1965',
                    hireDate => '01/01/2010',
        );
        die unless $employee->isa('OOPerlTest::Personal::Person');
        die unless $employee->isa('OOPerlTest::Personal::Person::Employee');
        return $employee;
    }
}

use Test::More;

my $class_person = 'OOPerlTest::Personal::Person';
my $class_employee = 'OOPerlTest::Personal::Person::Employee';
my $class_manager = 'OOPerlTest::Personal::Person::Employee::Manager';
{
    my $manager = $class_manager->new
    (
        name => 'Rafael Rodriguez',
        alias => 'rafe',
        dateOfBirth => '10/24/1970',
        hireDate => '01/01/2010'
    );

    my $person = $class_person->new(
        name => 'Jack Smith',
        alias => 'Jackie',
        dateOfBirth => '07/17/1980',
    );
    isa_ok($person, $class_person);
    cmp_ok($person->name, 'eq', 'Jack Smith', 'GOOD');
    cmp_ok($person->alias, 'eq', 'Jackie', 'GOOD');
    cmp_ok($person->dateOfBirth, 'eq', '07/17/1980', 'GOOD');
    my $employee = $manager->Hire($person);
    isa_ok($employee, $class_person);
    isa_ok($employee, $class_employee);
    cmp_ok($employee->name, 'eq', 'Bill Gates', 'BAD');
    cmp_ok($employee->alias, 'eq', 'Mr Evil', 'BAD');
    cmp_ok($employee->dateOfBirth, 'eq', '05/27/1965', 'BAD');
}
done_testing();

__END__

ok 1 - The object isa OOPerlTest::Personal::Person
ok 2 - GOOD
ok 3 - GOOD
ok 4 - GOOD
ok 5 - The object isa OOPerlTest::Personal::Person
ok 6 - The object isa OOPerlTest::Personal::Person::Employee
ok 7 - BAD
ok 8 - BAD
ok 9 - BAD
1..9
ok
All tests successful.
Files=1, Tests=9,  2 wallclock secs ( 0.03 usr  0.01 sys +  1.69 cusr
0.07 csys =  1.80 CPU) Result: PASS



On Fri, 21 Jan 2011 23:55:15 -0800
"Rick Apichairuk" <[email protected]> wrote:

> package OOPerlTest::Personal::Person;
> 
>  
> 
> use MooseX::Declare;
> 
>  
> 
> #class OOPerlTest::Personal::Person with
> OOPerlTest::Personal::Interface::Person {
> 
> class OOPerlTest::Personal::Person {
> 
>     #use MooseX::StrictConstructor;
> 
>     use OOPerlTest::Types qw(ValidDateManip);
> 
>  
> 
>     #+name : string [1]
> 
>     has 'name' => (
> 
>         is       => 'rw',
> 
>         isa      => 'Str',
> 
>         required => 1,
> 
>     );  
> 
>  
> 
>     #+dateOfBirth : string [1]
> 
>     has 'dateOfBirth' => (
> 
>         is       => 'rw',
> 
>         isa      => ValidDateManip,
> 
>         required => 1,
> 
>     );  
> 
>  
> 
>     #+alias : string [0..1]
> 
>     has 'alias' => (
> 
>         is       => 'rw',
> 
>         isa      => 'Str',
> 
>         required => 0,
> 
>     );  
> 
> }
> 
>  
> 
> __END__
> 
>  
> 
> package OOPerlTest::Personal::Person::Employee;
> 
>  
> 
> use MooseX::Declare;
> 
>  
> 
> class OOPerlTest::Personal::Person::Employee extends
> OOPerlTest::Personal::Person {
> 
>     use Carp;
> 
>     use Date::Manip;
> 
>     use OOPerlTest::Personal::Person;
> 
>     use OOPerlTest::Types qw(ValidDateManip WorkUnit);
> 
>  
> 
>     sub BUILDARGS {
> 
>         my ($self, %params) = @_;
> 
>  
> 
>         #use Data::Dumper;
> 
>         #print Dumper(\%params);
> 
>  
> 
>         return \%params;
> 
>     }
> 
>  
> 
>  
> 
>     #+hireDate : string [1]
> 
>     has 'hireDate' => (
> 
>         is       => 'rw',
> 
>         isa      => ValidDateManip,
> 
>         required => 1,
> 
>         trigger  => \&_make_sure_hiredate_is_after_dob,
> 
>     );
> 
>  
> 
>  
> 
>     sub _make_sure_hiredate_is_after_dob {
> 
>         my ($self, $hireDate) = @_;
> 
>  
> 
>         $self->dateOfBirth or return;
> 
>  
> 
>         my $d1 = ParseDate($self->dateOfBirth);
> 
>         my $d2 = ParseDate($hireDate);
> 
>  
> 
>         my $flag = Date_Cmp($d1, $d2);
> 
>  
> 
>         if ($flag == 1) {
> 
>             croak "dateOfBirth must be before hireDate!";
> 
>         }
> 
>     }
> 
>  
> 
> }
> 
>  
> 
> 1;
> 
>  
> 
> __END__
> 
>  
> 
>  
> 
> package OOPerlTest::Personal::Person::Employee::Manager;
> 
>  
> 
> use MooseX::Declare;
> 
>  
> 
> class OOPerlTest::Personal::Person::Employee::Manager extends
> OOPerlTest::Personal::Person::Employee {
> 
>     use Data::Dumper;
> 
>     use Date::Manip;
> 
>     use OOPerlTest::Personal::Person::EmployeeFactory;
> 
>     use OOPerlTest::Types qw(Person WorkUnit Employee);
> 
>  
> 
>     has 'employees' => (
> 
>         is       => 'rw',
> 
>         isa      =>
> 'ArrayRef[OOPerlTest::Personal::Person::Employee]',
> 
>         required => 0,
> 
>     );  
> 
>  
> 
>     has 'workUnitsProcessed' => (
> 
>         is       => 'rw',
> 
>         isa      => 'Int',
> 
>         required => 0,
> 
>     );  
> 
>  
> 
>     has 'employee_factory' => (
> 
>         is       => 'rw',
> 
>         isa      => 'OOPerlTest::Personal::Person::EmployeeFactory',
> 
>         required => 1,
> 
>         default  => sub {
> OOPerlTest::Personal::Person::EmployeeFactory->new() },
> 
>         lazy     => 1,
> 
>     );  
> 
>  
> 
>     has 'rejected' => (
> 
>         is       => 'rw',
> 
>         isa      => 'Int',
> 
>         required => 1,
> 
>         default  => sub { 0 },
> 
>         lazy     => 1,
> 
>     );  
> 
>  
> 
>     has 'completed' => (
> 
>         is       => 'rw',
> 
>         isa      => 'Int',
> 
>         required => 1,
> 
>         default  => sub { 0 },
> 
>         lazy     => 1,
> 
>     );  
> 
>  
> 
>     #+Hire(person : Person) : Employee
> 
>     method Hire (Person $person!) {
> 
>         #print Dumper($person);
> 
>         #my $employee =
> $self->employee_factory->new_from_person($person);
> 
>  
> 
>         # THIS IS BROKEN!!!!
> 
>         my $employee = OOPerlTest::Personal::Person::Employee->new(
> 
>                     name => 'Bill Gates',
> 
>                     alias => 'Mr Evil',
> 
>                     dateOfBirth => '05/27/1965',
> 
>                     hireDate => '01/01/2010',
> 
>         );
> 
>  
> 
>         # the object returned ISA Person and Employee but has none of
> the Person attributes!
> 
>         die unless $employee->isa('OOPerlTest::Personal::Person');
> 
>         die unless
> $employee->isa('OOPerlTest::Personal::Person::Employee');
> 
>  
> 
>         #print Dumper($employee);
> 
>  
> 
>         return $employee;
> 
>     }
> 
> }
> 
>  
> 
> 1;
> 
>  
> 
> __END__
> 
>  
> 
>  
> 
> # Before `make install' is performed this script should be runnable
> with
> 
> # `make test'. After `make install' it should work as `perl
> OOPerlTest-Personal.t'
> 
>  
> 
> #########################
> 
>  
> 
> use Test::More;
> 
> BEGIN { plan tests => 21 };
> 
>  
> 
> my $class_person = 'OOPerlTest::Personal::Person';
> 
> my $class_employee = 'OOPerlTest::Personal::Person::Employee';
> 
> my $class_manager = 'OOPerlTest::Personal::Person::Employee::Manager';
> 
> my $class_workUnit = 'OOPerlTest::Personal::WorkUnit';
> 
>  
> 
> use_ok($class_person);
> 
> use_ok($class_employee);
> 
> use_ok($class_manager);
> 
> use_ok($class_workUnit);
> 
>  
> 
> {
> 
>     my $manager = $class_manager->new
> 
>     (   
> 
>         name => 'Rafael Rodriguez',
> 
>         alias => 'rafe',
> 
>         dateOfBirth => '10/24/1970',
> 
>         hireDate => '01/01/2010'
> 
>     );  
> 
>  
> 
>     my $person = $class_person->new(
> 
>         name => 'Jack Smith',
> 
>         alias => 'Jackie',
> 
>         dateOfBirth => '07/17/1980',
> 
>     );  
> 
>     
> 
>     isa_ok($person, $class_person);
> 
>     cmp_ok($person->name, 'eq', 'Jack Smith', 'GOOD');
> 
>     cmp_ok($person->alias, 'eq', 'Jackie', 'GOOD');
> 
>     cmp_ok($person->dateOfBirth, 'eq', '07/17/1980', 'GOOD');
> 
>     
> 
>     my $employee = $manager->Hire($person);
> 
>  
> 
>     isa_ok($employee, $class_person);
> 
>     isa_ok($employee, $class_employee);
> 
>  
> 
>     cmp_ok($employee->name, 'eq', 'Jack Smith', 'BAD');
> 
>     cmp_ok($employee->alias, 'eq', 'Jackie', 'BAD');
> 
>     cmp_ok($employee->dateOfBirth, 'eq', '07/17/1980', 'BAD');
> 
> }
> 
>  
> 
> Rick Apichairuk
> 
>  
> 


-- 

Nicholas Perez
XMPP/Email: [email protected]
http://search.cpan.org/~nperez/
http://github.com/nperez

Reply via email to