package Karl::Constructor { use Role::Tiny; use feature qw(say); say __PACKAGE__; sub new { my ( $class, $self ) = @_; bless $self, $class; $self; } 1; } package CarConstructor { use feature qw(say); use Role::Tiny; use Role::Tiny::With; with qw(Karl::Constructor); requires qw(brand model color hp price); say __PACKAGE__; 1; } package CarConfigurator { use Role::Tiny::With; use feature qw(say); with qw(CarConstructor SomePlugin); say __PACKAGE__; sub brand { shift->{brand}; } sub color { shift->{color}; } sub hp { shift->{hp}; } sub price { shift->{price}; } sub model { shift->{model}; } 1; } package SomePlugin { use Role::Tiny; use feature qw(say); say __PACKAGE__; before brand => sub { say q(Tricky Dick!) }; around brand => sub { uc &{ (shift) }; }; after brand => sub { say q(Too late!); }; sub extra { shift->{extra}; } 1; } #!/usr/bin/env perl use strict; use warnings; use CarConfigurator; use feature qw(say); say __PACKAGE__; my $car = CarConfigurator->new( { brand => q(Porsche), color => q(Black), model => q(911), hp => q(>300), price => q(Don't ask), extra => q(Wine), } ); say qq(Brand:\t), $car->brand; say qq(Model:\t), $car->model; say qq(Color:\t), $car->color; say qq(hp:\t), $car->hp; say qq(Price:\t), $car->price; say qq(Extra:\t), $car->extra; __END__ karls-mac-mini:playground karl$ ./run.pl Karl::Constructor CarConstructor SomePlugin CarConfigurator main Tricky Dick! Too late! Brand: PORSCHE Model: 911 Color: Black hp: >300 Price: Don't ask Extra: Wine