9. Moose::Role Trait
(provided)
✤
(required)
✤
( OK)
✤
package TaxRole;
TaxRole
use Moose::Role;
requires 'price';
comsumption_tax price
our $TAX_RATE = 0.05;
tax_inclusive_price
sub consumption_tax{
return shift->price * $TAX_RATE;
}
sub tax_inclusive_price{
my $self = shift;
return $self->price + $self->consumption_tax;
}
no Moose::Role;
10. Moose::Role Trait
Trait
✤
required
✤
Goods
package Goods;
use Moose;
price
has price => (
isa => 'Int',
TaxRole
is => 'ro',
required => 1,
comsumption_tax price
);
tax_inclusive_price
with 'TaxRole';
no Moose;
11. Trait
sum : t1 + t2
✤
alias : t[a→b]
✤
exclusion : t - a
✤
12. Trait (1) - sum
package TraitsA;
required + provided = provided
✤
use Moose::Role;
required + required = required
✤
with 'TraitsB';
provided + provided = required ( )
✤
no Moose::Role;
TraitA TraitB TraitA
+= a ⇒
a c d b a
b d c c d
13. sum : ...
(m, ⊥: ,⟙: ) m1 ⊔ ⟙ = ⟙
→ ✤
✤
⟘⊔⟙=⟙
✤
⟘ ⊔⟘=⟘
✤
⟙⊔⟙=⟙
✤
m1 ⊔ ⟘ = m1
✤
provided: ⊥ ⟙
✤
m1 ⊔ m1 = m1
✤
m1 ⊔ m2 = ⟙ required: - provided
✤ ✤
TraitA TraitB TraitA
+= a = m3, c = m4 ⇒
a = m1, b = m2 b = m2, c = m4
c = ⟘, d = ⟘ d=⟘ a = ⟙, d = ⟘
14. Trait (2) - alias
package AnotherTraits;
use Moose::Role;
→
✤
with 'TraitsA' => {
alias => {a => 'e'},
};
no Moose::Role;
TraitA TraitA
[e → a] ⇒
a c a c
b d b d
e
15. Trait (3) - exclusion
package AnotherTraits;
use Moose::Role;
−
✤
with 'TraitsA' => {
excludes => ['a'],
};
no Moose::Role;
TraitA TraitA
-= a ⇒
a c b c
b d d
16. Trait :
package TraitsA;
use Moose::Role;
TraitA
with 'TraitsB' => {
a b
alias => {b => 'e'},
excludes => ['c'], c
}; d
e
no Moose::Role;
TraitA TraitB
a d += ( b a [e → b] - c )
b c
c d
17. Trait :
package TraitsA;
use Moose::Role;
TraitA
with 'TraitsB' => {
a b
alias => {b => 'e'},
excludes => ['c'], c
}; d
e
no Moose::Role;
TraitA TraitB
+= ( b = e
a d a [e → b] - c )
=
b c
c d
18. Trait
✤
package Trait; package Class;
use Moose::Role; use Moose;
sub class_vs_trait{ print __PACKAGE__, quot;nquot;; } extends 'SuperClass'; with 'Trait';
sub super_vs_trait{ print __PACKAGE__, quot;nquot;; } sub class_vs_trait{ print __PACKAGE__, quot;nquot;; }
no Moose::Role; no Moose;
package SuperClass; package main;
use Moose; my $c = Class->new;
sub super_vs_trait{ print __PACKAGE__, quot;nquot;; } $c->class_vs_trait;
no Moose; $c->super_vs_trait;
20. package TraitA;
use Moose::Role; package Class;
sub vs{ print __PACKAGE__, quot;nquot; } use Moose;
no Moose::Role; with 'TraitA', 'TraitB';
no Moose;
package TraitB;
use Moose::Role; package main;
sub vs{ print __PACKAGE__, quot;nquot; } Class->new->vs;
no Moose::Role;