package Module::Functional; # functional # the more complex operations and logic would happen here sub clean_to_level { my ($cleanliness_now, $target_cleanliness) = @_; while( $cleanliness_now < $target_cleanliness ){ $cleanliness_now++; } return $cleanliness_now; } 1; package Module::OO; use Module::Functional; # oo version # this package would in great part be an interface to the other package. sub clean_to_level { my ($self,$target_cleanliness) = @_; $target_cleanliness ||= $self->default_target_cleanliness; return Module::Functional::clean_to_level( $self->cleanliness_now, $target_cleanliness, ); }