> -----Original Message----- 
> Heh, I apologize for being overly cranky yesterday. Please send the left pinky
> to the TPF to hold so we can auction it off at YAPC::NA.
> 

No problem, I get cranky too. Pinky is on it's way. 
 
> MooseX::Declare is I think confusing things a bit yes. If however you can get 
> a
> cleaned up example that exhibits the behavior your seeing, I'd be happy (and
> promise less cranky) to take a look at it.
> 
> -Chris

I've cleaned up the code as much as I could. I've included the source code 
here. The classes are meant to be written out to separate files. You should see 
that tests 6,7, and 8 fail.

Thanks in advance for anyone who looks into this!

use Test::More;
BEGIN { plan tests => 9 };

my $class_person = 'Person';
my $class_employee = 'Employee';
my $class_manager = 'Manager';

use_ok($class_person);
use_ok($class_employee);
use_ok($class_manager);

{
    my $manager = Manager->new(
        name => 'Rick Apichairuk',
        alias => 'Rickie Speedmaster',
        dateOfBirth => '01/01/1985',
        hireDate => '01/01/2000',
    );  

    my $employee = $manager->Broken(
        name => 'Bill Gates',
        alias => 'Mr Evil',
        dateOfBirth => '05/27/1965',
        hireDate => '01/01/2010',
    );  

    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');
    cmp_ok($employee->hireDate, 'eq', '01/01/2010', 'KINDA GOOD - This is the 
only attribute that gets set!');
}


package Types;

use strict;
use warnings;


# predeclare our own types
use MooseX::Types -declare => [
    qw( 
          TypeWorkUnit
          TypeWorkUnitStatus
          TypeValidDateManip
          TypePerson
          TypeEmployee
      )
];

# import builtin types
use MooseX::Types::Moose qw/Undef Int Str/;
use Date::Manip;

subtype TypeValidDateManip,
    as Str,
    where { Date::Manip::ParseDate($_) // 0 }, message { "Failed to be parsed 
by Date::Manip" };

subtype TypeWorkUnitStatus, 
    as Str,
    where {
        (   
                $_ eq 'NotStarted'
            or  $_ eq 'Started'
            or  $_ eq 'Completed'
            or  $_ eq 'Rejected'
        )   
    }, message { "Invalid WorkUnitStatus" };


require WorkUnit;

class_type TypeWorkUnit,   { class => 'WorkUnit' };

require Person;

class_type TypePerson,     { class => 'Person' };

require Employee;

class_type TypeEmployee,   { class => 'Employee' };

1;

__END__

use MooseX::Declare;

class Employee extends Person {
    use Carp;
    use Date::Manip;
    use Person;
    use Types qw(TypeValidDateManip);

    sub BUILDARGS {
        my ($self, %params) = @_; 

        #use Data::Dumper;
        #print Dumper(\%params);

        return \%params;
    }   


    #+hireDate : string [1]
    has 'hireDate' => (
        is       => 'rw',
        isa      => TypeValidDateManip,
        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__

class Manager extends Employee {
    use Data::Dumper;
    use Date::Manip;
    use Types qw(TypePerson TypeEmployee);

    has 'employees' => (
        is       => 'rw',
        isa      => 'ArrayRef[TypeEmployee]',
        required => 0,
    );  

    has 'workUnitsProcessed' => (
        is       => 'rw',
        isa      => 'Int',
        required => 0,
    );  

    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,
    );  

    method Broken (Str :$name!, Str :$alias!, Str :$dateOfBirth!, Str 
:$hireDate!) {
        my $employee = Employee->new(
                    name => $name,
                    alias => $alias,
                    dateOfBirth => $dateOfBirth,
                    hireDate => $hireDate,
        );  

        # the object returned ISA Person and Employee but has none of the 
Person attributes!
        die unless $employee->isa('Person');
        die unless $employee->isa('Employee');

        print Dumper($employee);

        return $employee;
    }   
}

__END__

use MooseX::Declare;

class Person {
    #use MooseX::StrictConstructor;
    use Types qw(TypeValidDateManip);

    has 'name' => (
        is       => 'rw',
        isa      => 'Str',
        required => 1,
    );  

    has 'dateOfBirth' => (
        is       => 'rw',
        isa      => TypeValidDateManip,
        required => 1,
    );  

    has 'alias' => (
        is       => 'rw',
        isa      => 'Str',
        required => 0,
    );  
}

__END__

use MooseX::Declare;

class WorkUnit {
    use Types qw(TypeWorkUnitStatus);

    #+project : string [0..1]
    has 'project' => (
        is       => 'rw',
        isa      => 'Str',
        required => 0,
    );  

    #+task : string [1]
    has 'task' => (
        is       => 'rw',
        isa      => 'Str',
        required => 1,
    );  

    #+status : WorkUnitStatus [1]
    has 'status' => (
        is       => 'rw',
        isa      => TypeWorkUnitStatus,
        required => 1,
    );  

    #+payload : String [0..1]
    has 'payload' => (
        is       => 'rw',
        isa      => 'Str',
        required => 0,
    );  
}

__END__

Rick



Reply via email to