use strict; use warnings; package Divisor; use Carp; sub new { my ($class, $divisor) = @_; croak "Not an integer: $divisor" if $divisor != int $divisor; my $instance = bless \$divisor => $class; $instance->_init($divisor); } sub _init { my ($instance, $divisor) = @_; $instance->set_divisibility_test( sub { my ($dividend) = @_; my $remainder = $dividend % $divisor; return ($remainder == 0); } ); return $instance; } my %divisibility_test_for; sub set_divisibility_test { my ($self, $code_ref) = @_; croak "Not a CODE ref: $code_ref" if ref $code_ref ne 'CODE'; $divisibility_test_for{$self} = $code_ref; } sub divides { my ($self, $dividend) = @_; croak "Not an integer: $dividend" if $dividend != int $dividend; $divisibility_test_for{$self}($dividend); } 'Divide et impera!';