> -----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