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

 

Reply via email to