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